Tenho alguns testes antigos do Pester v4 que falham quando tento executá-los no Pester v5.
Com o Pester v4, li que, uma vez Mock
chamado, ele continuará a ser aplicado ao restante do Describe
bloco, mesmo que tenha sido chamado dentro de um It
bloco. Então eu chamaria isso do Describe
bloco, fora de um It
bloco, para deixar óbvio que não se aplica apenas a um único It
bloco.
Esse comportamento que funcionou no Pester v4 parece não funcionar no Pester v5.
Este é o script no qual estou escrevendo testes, MyScriptToTest.ps1:
function Get-FirstText ()
{
return 'Some text'
}
function Get-SecondText ()
{
return 'Other text'
}
function Get-Text ()
{
$a = Get-FirstText
$b = Get-SecondText
return "$a; $b"
}
E aqui estão os testes, em MyScriptToTest.Tests.ps1:
BeforeAll {
. (Join-Path $PSScriptRoot 'MyScriptToTest.ps1')
}
Describe 'Get-FirstText' {
It 'returns text "Some text"' {
$result = Get-FirstText
$result | Should -Be 'Some text'
}
}
Describe 'Get-Text' {
It 'returns text "Some text; Other text"' {
Get-Text | Should -Be 'Some text; Other text'
}
Mock Get-FirstText { return 'Mock text' }
It 'returns text "Mock text; Other text" after mocking Get-FirstText' {
Get-Text | Should -Be 'Mock text; Other text'
}
}
A saída do teste Pester v5 é a seguinte:
Describing Get-FirstText
[+] returns text "Some text" when called indirectly 13ms (8ms|5ms)
Describing Get-Text
[+] returns text "Some text; Other text" 66ms (54ms|13ms)
[-] returns text "Mock text; Other text" after mocking Get-FirstText 42ms (41ms|1ms)
Expected strings to be the same, but they were different.
String lengths are both 21.
Strings differ at index 0.
Expected: 'Mock text; Other text'
But was: 'Some text; Other text'
^
at Get-Text | Should -Be 'Mock text; Other text', C:\...\MyScriptToTest.Tests.ps1:20
at <ScriptBlock>, C:\...\MyScriptToTest.Tests.ps1:20
Tests completed in 565ms
Tests Passed: 2, Failed: 1, Skipped: 0 NotRun: 0
No entanto, se eu mover o Mock
comando para o It
bloco, ele funcionará:
BeforeAll {
. (Join-Path $PSScriptRoot 'MyScriptToTest.ps1')
}
Describe 'Get-FirstText' {
It 'returns text "Some text"' {
$result = Get-FirstText
$result | Should -Be 'Some text'
}
}
Describe 'Get-Text' {
It 'returns text "Some text; Other text"' {
Get-Text | Should -Be 'Some text; Other text'
}
It 'returns text "Mock text; Other text" after mocking Get-FirstText' {
Mock Get-FirstText { return 'Mock text' }
Get-Text | Should -Be 'Mock text; Other text'
}
}
Não descobri as novas restrições ao chamar o Mock
comando no Pester v5. O Mock
comando ainda pode ser chamado dentro de um bloco Describe
ou Context
, fora de um It
bloco? Ou agora sempre precisa ser chamado dentro de um It
bloco?
Os documentos descrevem a mudança v5+ de onde
Mock
os comandos devem (agora) ser colocados (ênfase adicionada):Ou seja, um
Mock
comando colocado diretamente dentroDescribe
de ouContext
comandos - como no código da sua pergunta - agora é efetivamente ignorado .Para esclarecer: No Pester v5+ , para que uma
Mock
declaração seja eficaz, ela deve ser colocada dentro de uma das seguintes construções :Dentro de um
BeforeAll
comando , que portanto se aplica a todos os testes do mesmo escopo .BeforeAll
comando pode ser colocado diretamente dentro de umDescribe
comando ou - para um controle mais refinado - dentro de umContext
comando aninhado.It
Dentro de um comando individual , caso em que se aplica apenas a esse teste .No contexto do seu código, isso significa:
Context
-nívelMock
:It
-nívelMock
: