用途:把 Pester v5 的经典断言(Should -Be,空格后接参数)转换为 Pester v6 的新 Should-* 断言(Should-Be,连字符、无空格)。状态为实验性/预览,已验证于 Pester 6.0.0-rc2。经典写法在 v6 中仍可用,因此可增量迁移并保持测试通过。这是可选迁移技能;跨主版本(v3→v4→v5→v6)升级套件、运行时、Mock 与配置需使用单独的 pester-migration 技能。
适用时机:将 Pester 套件现代化到 v6 的 Should-* 断言;用户要求迁移/转换/重写 Should -... 调用;希望获得更清晰、类型感知的失败消息。
必要前提:需 Pester v6 及以上,Should-* 命令在 v5 中不存在。否定是独立命令而非 -Not 开关:Should -Not -Be → Should-NotBe,新断言没有 -Not 参数。实际值仍来自管道($x | Should-Be 1)或 -Actual(Should-Be -Actual $x -Expected 1),-Because 保持不变。多数改名是机械替换,但有若干行为变化需人工确认。
步骤一,定位经典断言:搜索 Should -(经典运算符)、Should -Not -(否定经典)、Assert-MockCalled(v6 中移除,改为 Should-Invoke),范围限定 PowerShell 测试文件(.Tests.ps1、.ps1)。
步骤二,套用映射(完整列表见 references/assertion-map.md):$x | Should -Be 1 → Should-Be 1;Should -Not -Be 1 → Should-NotBe 1;Should -BeExactly 'A' → Should-BeString 'A' -CaseSensitive;Should -BeGreaterOrEqual 2 → Should-BeGreaterThanOrEqual 2;Should -BeLessOrEqual 2 → Should-BeLessThanOrEqual 2;Should -BeLike 'a*' → Should-BeLikeString 'a*';Should -Match 're' → Should-MatchString 're';Should -BeOfType [int] → Should-HaveType ([int]);Should -BeNullOrEmpty 无单一对应,见注意事项;$c | Should -HaveCount 3 → Should-BeCollection -Count 3;$c | Should -Contain 2 → Should-ContainCollection 2;{ ... } | Should -Throw 'msg' → Should-Throw -ExceptionMessage 'msg';Should -Invoke Get-Thing → Should-Invoke Get-Thing;Should -InvokeVerifiable → Should-Invoke -Verifiable。
步骤三,检查行为差异(不可跳过):大小写,经典 Should -Be 对字符串不区分大小写,Should-Be 同样,但经典 Should -BeExactly(区分大小写)无直接等价,需 Should-BeString -CaseSensitive,Should-Be 从不对大小写敏感,BeLikeExactly、MatchExactly 同理。真值,经典 Should -BeTrue/-BeFalse 接受任意真值/假值(1、'x'、0、''、$null、@()),新的 Should-BeTrue/-BeFalse 严格(必须正好 $true/$false),要保留旧的宽松行为用 Should-BeTruthy/-BeFalsy。BeNullOrEmpty 无单一等价,按意图选择:$null → Should-BeNull;空字符串 → Should-BeEmptyString;空集合 → Should-BeCollection -Count 0;广义假值 → Should-BeFalsy,其否定类似拆分为 Should-NotBeNull / Should-NotBeEmptyString / Should-NotBeWhiteSpaceString。集合,经典 Should -Be 也比较数组,新 Should-Be 是值断言,若 -Expected 为集合会报错(You provided a collection to the -Expected parameter),比较数组用 Should-BeCollection;Should -Contain(单项成员)→ Should-ContainCollection,新命令还可接收期望项集合并检查全部存在且顺序正确(1, 2, 3 | Should-ContainCollection @(1, 2)),整体精确相等用 Should-BeCollection。管道解包,管道会解包输入:值断言把 @(1) 视为 1、@() 视为 $null,带类型集合([int[]])会被重新收集为 [object[]];当精确值或具体集合类型重要时(如 Should-HaveType),用 -Actual 传参而非管道。无 Should-* 等价:Should -Exist 和 Should -FileContentMatch* 系列没有新对应,可保留经典断言,或用 PowerShell 重写:Test-Path $p | Should-BeTrue、(Get-Content $p -Raw) | Should-MatchString 're'。Should -BeIn 方向:无 Should-BeIn,反转操作数 $value | Should -BeIn $collection → $collection | Should-ContainCollection $value(注意实际/期望互换),或保留经典形式。
步骤四,验证:运行套件确认仍通过,Invoke-Pester -Path ./tests;若转换后新失败,复查上述注意事项(最常见为真值/假值、null-or-empty、集合语义)。
步骤五(可选),强制新风格:套件完全迁移后关闭经典语法,防止回流:$config = New-PesterConfiguration; $config.Should.DisableV5 = $true。设置后任何残留 Should -Be 会抛错并指向 Should-Be 形式。
输出:总结改动,包括涉及文件、转换断言数、有意保留的经典断言(如 Should -Exist)、以及需人工决策的转换(真值/假值、null-or-empty、集合语义)。
参考:references/assertion-map.md(逐运算符对照表与前后示例及变通方案);实时命令参考 https://pester.dev/docs/commands/Should-Be(替换任意 Should-* 名称);概念 https://pester.dev/docs/assertions/should-command(值断言与集合断言、管道与 -Actual);v5→v6 升级指南 https://pester.dev/docs/migrations/v5-to-v6。
限制:实验性/预览;依赖 Pester v6+;部分行为差异须人工判断,无法纯机械替换。