AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77166435
Accepted
Simon Elms
Simon Elms
Asked: 2023-09-24 17:21:08 +0800 CST2023-09-24 17:21:08 +0800 CST 2023-09-24 17:21:08 +0800 CST

O comando Pester v5 Mock pode ser chamado fora de um bloco It, Before ou After?

  • 772

Tenho alguns testes antigos do Pester v4 que falham quando tento executá-los no Pester v5.

Com o Pester v4, li que, uma vez Mockchamado, ele continuará a ser aplicado ao restante do Describebloco, mesmo que tenha sido chamado dentro de um Itbloco. Então eu chamaria isso do Describebloco, fora de um Itbloco, para deixar óbvio que não se aplica apenas a um único Itbloco.

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 Mockcomando para o Itbloco, 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 Mockcomando no Pester v5. O Mockcomando ainda pode ser chamado dentro de um bloco Describeou Context, fora de um Itbloco? Ou agora sempre precisa ser chamado dentro de um Itbloco?

powershell
  • 1 1 respostas
  • 17 Views

1 respostas

  • Voted
  1. Best Answer
    mklement0
    2023-09-24T20:52:00+08:002023-09-24T20:52:00+08:00

    Os documentos descrevem a mudança v5+ de onde Mockos comandos devem (agora) ser colocados (ênfase adicionada):

    Os mocks não são mais eficazes no todo Describe/Context em que foram colocados. Em vez disso, eles serão padronizados para o bloco em que foram colocados.

    Ou seja, um Mockcomando colocado diretamente dentro Describede ou Contextcomandos - como no código da sua pergunta - agora é efetivamente ignorado .

    Para esclarecer: No Pester v5+ , para que uma Mockdeclaração seja eficaz, ela deve ser colocada dentro de uma das seguintes construções :

    • Dentro de um BeforeAllcomando , que portanto se aplica a todos os testes do mesmo escopo .

      • Um BeforeAllcomando pode ser colocado diretamente dentro de um Describecomando ou - para um controle mais refinado - dentro de um Contextcomando aninhado.
    • ItDentro de um comando individual , caso em que se aplica apenas a esse teste .


    No contexto do seu código, isso significa:

    Context-nívelMock :

    Describe 'Get-Text' {
        It 'returns text "Some text; Other text"' {
            Get-Text | Should -Be 'Some text; Other text'
            } 
    
        Context 'With Mock' {
    
          BeforeAll {
            # Placing the Mock here works, and makes it take effect
            # for all tests in this context.
            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'
              } 
    
          # ... potentially more `It` commands to which the Mock applies.
        }
    }
    

    It-nívelMock :

    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' {
            # Placing the Mock here works, and makes it take effect
            # for this specific test only.
            Mock Get-FirstText { return 'Mock text' }
            Get-Text | Should -Be 'Mock text; Other text'
            } 
    }
    
    • 1

relate perguntas

  • Como faço para obter o identificador de processo de um trabalho?

  • One-liner do PowerShell - Como

  • Powershell 5.1: descrições de alias estão faltando no meu módulo

  • Import-CSV: adiciona linhas (membros) ao objeto resultante no loop foreach

  • Use e modifique minha variável em todo powershell startthreadjob

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve