gpt4 book ai didi

powershell - Pester 5.0.2 BeforeAll block 代码未显示在 Describe block 中

转载 作者:行者123 更新时间:2023-12-03 01:26:32 27 4
gpt4 key购买 nike

我最近切换到 Pester 5.0.2,开始对我编写的 Powershell 脚本进行一些测试。我能够进入 BeforeAll block 并且路径正在按照我的预期填充,但是当我到达我的 Describe block 中的 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('#?'))
}
}
}

最佳答案

我找到了答案,但在文档中很难找到。由于新的“发现”功能,这不再有效。这在所有 Describe、It、Context、BeforeAll、AfterAll 等 block 之前运行。然后丢弃此处运行的代码。

我最终使用了使用 -TestCase 参数的测试用例来解决问题。

编辑:

下面的版本带有关于为什么它不起作用的评论,然后是如何设置它的示例。

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]
}
}

}

关于powershell - Pester 5.0.2 BeforeAll block 代码未显示在 Describe block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62497134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com