对 Pester 中集合中的每个项目进行断言

Assertion over each item in collection in Pester

我正在 Pester 中进行一些基础设施测试,但有重复的场景,我不知道如何处理。

比方说,我想检查 IIS 上是否启用了所有必需的 Web 角色。我有一组必需的 Web 角色,我想为每个角色声明它已启用。

我当前的代码如下所示:

$requiredRoles = @(
    "Web-Default-Doc",
    "Web-Dir-Browsing",
    "Web-Http-Errors",
    "Web-Static-Content",
    "Web-Http-Redirect"
)

Context "WebRoles" {

    It "Has installed proper web roles" {

        $requiredRoles  | % {
            $feature = Get-WindowsOptionalFeature -FeatureName $_ -online
            $feature.State | Should Be "Enabled"
        }
    }
}

从某种意义上说,如果任何角色不是 enabled/installed,测试就会失败。但如果这种 Pester 测试的输出如下所示,那几乎没有用:

Context WebRoles
[-] Has installed proper web roles 2.69s
  Expected: {Enabled}
  But was:  {Disabled}
  283:                 $feature.State | Should Be "Enabled" 

这个结果没有给出任何关于哪个功能被禁用的线索。

在这些场景中有什么推荐的做法吗?我在考虑一些字符串操作......

Context "WebRoles" {

    It "Has installed proper web roles" {

        $requiredRoles  | % {
            $feature = Get-WindowsOptionalFeature -FeatureName $_ -online
            $toCompare = "{0}_{1}" -f $feature.FeatureName,$feature.State 
            $toCompare | Should Be ("{0}_{1}" -f $_,"Enabled")
        }
    }
 }

这将输出:

Context WebRoles
[-] Has installed proper web roles 2.39s
  Expected string length 27 but was 28. Strings differ at index 20.
  Expected: {IIS-DefaultDocument_Enabled}
  But was:  {IIS-DefaultDocument_Disabled}
  -------------------------------^
  284:                 $toCompare | Should Be ("{0}_{1}" -f $_,"Enabled")

...哪个比较好,但是感觉不是很好...

此外,还有第二个问题,即测试将在第一次失败时停止,我需要在修复每个功能后重新运行测试...

有什么想法吗?

将你的 It 放入循环中,如下所示:

Context "WebRoles" {
  $requiredRole | ForEach-Object {
    It "Has installed web role $_" {
      (Get-WindowsOptionalFeature -FeatureName $_ -online).State | Should Be "Enabled"
    }
  }  
}