将 PowerShell 散列的 key/values 与 Pester 测试用例一起使用
Use a PowerShell hash's key/values with Pester TestCases
我想通过 TestCases
参数将 PowerShell 散列的 key/values 传递给 Pester 单元测试:
BeforeAll {
$Expected = @{
Address1='Address1'
Address2='Address2'
City='City'
RegionCode='RegionCode'
PostalCode='PostalCode'
}
}
BeforeEach {
Mock Invoke-SqlCmd
Invoke-MyFunction @Expected
}
It "sets the column '<Name>' with the value '<Value>'" -TestCases ( $Optional.GetEnumerator() | ForEach-Object { @{Name=$_.Key; Value=$_.Value} } ) {
param($Name, $Value)
$Test = "*{0}='{1}'*" -f $Name, $Value
Assert-MockCalled Invoke-Sqlcmd -ParameterFilter {
$Query -like $Test
}
}
但似乎无法正确获取散列的属性 'shaped' 以使测试正常工作。
构建测试用例所需的任何内容都需要放在 BeforeDiscovery { ... }
块中。 BeforeAll { ... }
中的代码被推迟到执行测试之前,但是您的 $expected
哈希表需要在 before 发现之前可用,以便构建每个从你的测试用例中测试。除此之外,您需要将 It { ... }
块嵌套在 Describe
或 Context
块中
更新:根据您的评论 - 为了使 $Expected
可用于测试范围而不复制 BeforeEach 块中的分配,您可以将变量的范围设置为脚本范围
BeforeDiscovery {
$script:Expected = @{
Address1 = 'Value_Address1'
Address2 = 'Value_Address2'
City = 'Value_City'
RegionCode = 'Value_RegionCode'
PostalCode = 'Value_PostalCode'
}
}
Describe "Need a describe or context block" {
BeforeEach {
Mock Invoke-SqlCmd
Invoke-MyFunction @Expected
}
It "sets the column '<Name>' with the value '<Value>'" -TestCases (
$Expected.GetEnumerator() |
ForEach-Object { @{Name = $_.Key; Value = $_.Value } }
) {
# param($Name, $Value)
$Test = "*{0}='{1}'*" -f $Name, $Value
# Assert-MockCalled Invoke-Sqlcmd -ParameterFilter {
# $Query -like $Test
# }
}
}
输出
Pester v5.3.1
Starting discovery in 1 files.
Discovery found 5 tests in 25ms.
Running tests.
Running tests from 'C:\temp\powershell\pester.tests.ps1'
Describing Need a describe or context block
[+] sets the column 'RegionCode' with the value 'Value_RegionCode' 8ms (4ms|4ms)
[+] sets the column 'City' with the value 'Value_City' 2ms (1ms|1ms)
[+] sets the column 'Address2' with the value 'Value_Address2' 5ms (1ms|3ms)
[+] sets the column 'PostalCode' with the value 'Value_PostalCode' 3ms (1ms|2ms)
[+] sets the column 'Address1' with the value 'Value_Address1' 3ms (1ms|2ms)
Tests completed in 168ms
Tests Passed: 5, Failed: 0, Skipped: 0 NotRun: 0
查看 Pester 的 v5 Discovery and Run 文档
从该页面转述:
这是在您 运行 Invoke-Pester
的初始发现阶段发生的情况
- 调用测试脚本文件
BeforeAll
函数 运行s 只保存提供给它的脚本块,不执行它(还)哈希表和该块内的其他变量尚未创建
Describe
函数 运行s 并调用提供给它的脚本块,以收集有关其中包含的测试的信息。注意:Describe
和 Context
脚本块是发现期间唯一 运行 的脚本块
- 提供给
It
函数的所有参数(包括 -TestCases
)均由 PowerShell 计算 (这是需要哈希表的地方,但遗憾的是它还没有出现)
It
函数 运行s 保存(不是 运行ning)包含生成测试的代码,先前评估的 -TestCases
数组中的每个项目 1 个
Write-Host "Discovery done."
是 运行.
我想通过 TestCases
参数将 PowerShell 散列的 key/values 传递给 Pester 单元测试:
BeforeAll {
$Expected = @{
Address1='Address1'
Address2='Address2'
City='City'
RegionCode='RegionCode'
PostalCode='PostalCode'
}
}
BeforeEach {
Mock Invoke-SqlCmd
Invoke-MyFunction @Expected
}
It "sets the column '<Name>' with the value '<Value>'" -TestCases ( $Optional.GetEnumerator() | ForEach-Object { @{Name=$_.Key; Value=$_.Value} } ) {
param($Name, $Value)
$Test = "*{0}='{1}'*" -f $Name, $Value
Assert-MockCalled Invoke-Sqlcmd -ParameterFilter {
$Query -like $Test
}
}
但似乎无法正确获取散列的属性 'shaped' 以使测试正常工作。
构建测试用例所需的任何内容都需要放在 BeforeDiscovery { ... }
块中。 BeforeAll { ... }
中的代码被推迟到执行测试之前,但是您的 $expected
哈希表需要在 before 发现之前可用,以便构建每个从你的测试用例中测试。除此之外,您需要将 It { ... }
块嵌套在 Describe
或 Context
块中
更新:根据您的评论 - 为了使 $Expected
可用于测试范围而不复制 BeforeEach 块中的分配,您可以将变量的范围设置为脚本范围
BeforeDiscovery {
$script:Expected = @{
Address1 = 'Value_Address1'
Address2 = 'Value_Address2'
City = 'Value_City'
RegionCode = 'Value_RegionCode'
PostalCode = 'Value_PostalCode'
}
}
Describe "Need a describe or context block" {
BeforeEach {
Mock Invoke-SqlCmd
Invoke-MyFunction @Expected
}
It "sets the column '<Name>' with the value '<Value>'" -TestCases (
$Expected.GetEnumerator() |
ForEach-Object { @{Name = $_.Key; Value = $_.Value } }
) {
# param($Name, $Value)
$Test = "*{0}='{1}'*" -f $Name, $Value
# Assert-MockCalled Invoke-Sqlcmd -ParameterFilter {
# $Query -like $Test
# }
}
}
输出
Pester v5.3.1
Starting discovery in 1 files.
Discovery found 5 tests in 25ms.
Running tests.
Running tests from 'C:\temp\powershell\pester.tests.ps1'
Describing Need a describe or context block
[+] sets the column 'RegionCode' with the value 'Value_RegionCode' 8ms (4ms|4ms)
[+] sets the column 'City' with the value 'Value_City' 2ms (1ms|1ms)
[+] sets the column 'Address2' with the value 'Value_Address2' 5ms (1ms|3ms)
[+] sets the column 'PostalCode' with the value 'Value_PostalCode' 3ms (1ms|2ms)
[+] sets the column 'Address1' with the value 'Value_Address1' 3ms (1ms|2ms)
Tests completed in 168ms
Tests Passed: 5, Failed: 0, Skipped: 0 NotRun: 0
查看 Pester 的 v5 Discovery and Run 文档
从该页面转述:
这是在您 运行 Invoke-Pester
- 调用测试脚本文件
BeforeAll
函数 运行s 只保存提供给它的脚本块,不执行它(还)哈希表和该块内的其他变量尚未创建Describe
函数 运行s 并调用提供给它的脚本块,以收集有关其中包含的测试的信息。注意:Describe
和Context
脚本块是发现期间唯一 运行 的脚本块- 提供给
It
函数的所有参数(包括-TestCases
)均由 PowerShell 计算 (这是需要哈希表的地方,但遗憾的是它还没有出现) It
函数 运行s 保存(不是 运行ning)包含生成测试的代码,先前评估的-TestCases
数组中的每个项目 1 个Write-Host "Discovery done."
是 运行.