将 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 { ... } 块嵌套在 DescribeContext 块中

更新:根据您的评论 - 为了使 $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 并调用提供给它的脚本块,以收集有关其中包含的测试的信息。注意:DescribeContext 脚本块是发现期间唯一 运行 的脚本块
  • 提供给 It 函数的所有参数(包括 -TestCases)均由 PowerShell 计算 (这是需要哈希表的地方,但遗憾的是它还没有出现)
  • It 函数 运行s 保存(不是 运行ning)包含生成测试的代码,先前评估的 -TestCases 数组中的每个项目 1 个
  • Write-Host "Discovery done." 是 运行.