简体   繁体   English

Pester 5.0.2 BeforeAll 块代码未显示在描述块中

[英]Pester 5.0.2 BeforeAll block code not showing up in Describe block

I recently switched over to Pester 5.0.2 to start doing some testing on a Powershell script I wrote.我最近切换到 Pester 5.0.2 开始对我编写的 Powershell 脚本进行一些测试。 I am able to break into the BeforeAll block and the paths are being populated as I would expect, however when I get to the Get-ChildItem area in my Describe block the variables from BeforeAll are $null.我能够闯入 BeforeAll 块,并且按照我的预期填充路径,但是当我到达 Describe 块中的 Get-ChildItem 区域时,来自 BeforeAll 的变量为 $null。

BeforeAll {
    $testDir = Split-Path $PSCommandPath -Parent
    $prodDir = Split-Path $testDir -Parent
}
Describe "Tests - All Files in prod" {
    Get-ChildItem $prodDir -File | ForEach-Object {
        $fileName = (Split-Path $_ -leaf).PadRight(20, ' ')
        $filePath = $_.PSPath
        It "Vars not declared or changed between function definitions" {
            [System.Collections.ArrayList]$preSource = (Get-Variable).Name
            . "$filePath" -Sourcing
            [System.Collections.ArrayList]$postSource = (Get-Variable).Name
            $postSource.Remove('preSource')
            $postSource.Remove('UnderTest')
            [array]$diff = Compare-Object $preSource $postSource -PassThru
            $diff | Should -BeNullOrEmpty
        }
        It "$fileName all #*, #?, #TODO tags are removed" {
            $_ | Should -Not -FileContentMatch $([regex]::escape('#TODO'))
            $_ | Should -Not -FileContentMatch $([regex]::escape('#*'))
            $_ | Should -Not -FileContentMatch $([regex]::escape('#?'))
        }
    }
}

I found the answer, but it was a little hard to find in the documentation.我找到了答案,但在文档中很难找到。 This doesn't work any longer because of the new 'Discovery' feature.由于新的“发现”功能,这不再起作用。 This runs before all of the Describe,It,Context,BeforeAll,AfterAll, etc... blocks.这在所有 Describe、It、Context、BeforeAll、AfterAll 等块之前运行。 The code that was run here is then discarded.然后丢弃此处运行的代码。

I ended up using test cases using the -TestCase parameter to resolve the issue.我最终使用 -TestCase 参数使用测试用例来解决问题。

EDIT:编辑:

Below is version with comments on why it won't work and after that an example on how to set it up.下面的版本带有关于它为什么不起作用的评论,然后是一个关于如何设置它的示例。

BeforeAll {
    # This block will run AFTER discovery. Anything you need to be evaluated in front of the tests should
    # be placed here
    $testDir = Split-Path $PSCommandPath -Parent
    $prodDir = Split-Path $testDir -Parent
}
$iWillDisappearAfterDiscovery = 'Byebye'
Describe "Describing your tests" {
    # Code placed here will be run DURING discovery, and will not be availble at runtime. Placing the code from
    # BeforeAll here instead would not work as $testDir and $prodDir would be empty when the tests ran. 
    #
    # The apparent exception to this rule is that the tests are done DURING discovery and then stashed for when
    # the tests run. That means your test cases can be set up here if not done directly inside the -TestCases parameter
    #
    Get-ChildItem $prodDir -File | ForEach-Object {
        $fileName = (Split-Path $_ -leaf).PadRight(20, ' ')
        $filePath = $_.PSPath
        It "Vars not declared or changed between function definitions" {
            [System.Collections.ArrayList]$preSource = (Get-Variable).Name
            . "$filePath" -Sourcing
            [System.Collections.ArrayList]$postSource = (Get-Variable).Name
            $postSource.Remove('preSource')
            $postSource.Remove('UnderTest')
            [array]$diff = Compare-Object $preSource $postSource -PassThru
            $diff | Should -BeNullOrEmpty
        }
        It "$fileName all #*, #?, #TODO tags are removed" {
            $_ | Should -Not -FileContentMatch $([regex]::escape('#TODO'))
            $_ | Should -Not -FileContentMatch $([regex]::escape('#*'))
            $_ | Should -Not -FileContentMatch $([regex]::escape('#?'))
        }
    }
}

# Here's a correct example:

BeforeAll {
    $testDir = Split-Path $PSCommandPath -Parent
    $prodDir = Split-Path $testDir -Parent
}
Describe "Describing your tests" {
    # You can still set them up dynamically as test cases
    [System.Collections.ArrayList]$testCases = @()
    Get-ChildItem $prodDir -File | ForEach-Object {
        $fileName = (Split-Path $_ -leaf).PadRight(20, ' ')
        $filePath = $_.PSPath
        $testCases.Add({fileName = $fileName; filePath = $filePath})
    }
    It "<fileName> Exists" -TestCases $testCases { 
        #using <varName> will dynamically name your tests with data
        # from your test cases
        $filePath | Should -Exist
    }
    It "<fileName> all #*, #?, #TODO tags are removed" {
        $filePath | Should -Not -FileContentMatch $([regex]::escape('#TODO'))
        $filePath | Should -Not -FileContentMatch $([regex]::escape('#*'))
        $filePath | Should -Not -FileContentMatch $([regex]::escape('#?'))
    }
    Context "Different Context, Run different tests" {
        $testCases = @{filename = 'file4'.PadRight(20, ' '); filepath = '/path/to/file4.ps1' },
        @{filename = 'file5'.PadRight(20, ' '); filepath = '/path/to/file5.ps1' }
        It "Exists" {
            $filePath | Should -Exist
        }
    }
    Context "You can also set them up inline like this" -TestCases @(
        $testCases = @{filename = 'file1'.PadRight(20, ' '); filepath = '/path/to/file1.ps1' },
        @{filename = 'file2'.PadRight(20, ' '); filepath = '/path/to/file2.ps1' },
        @{filename = 'file3'.PadRight(20, ' '); filepath = '/path/to/file3.ps1' }
    ) {
        It "Run some tests" {
            $fileName | Should -BeOfType [string]
        }
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM