Catalog
github/pester-should-migration

github

pester-should-migration

Experimental (preview) Pester skill for migrating classic Should -Be (v5) assertion syntax to the new Should-* (v6) assertions (note the hyphen, no space), e.g. `Should -Be` -> `Should-Be`, `Should -Not -Be` -> `Should-NotBe`. Tracks Pester 6, which is still a release candidate, so this guidance may change; verified against Pester 6.0.0-rc2. Use when converting Pester v5 assertions to Pester v6 Should-* operators, modernizing a Pester test suite, or when a user asks to migrate, convert, or rewrite `Should -...` calls in .Tests.ps1 / PowerShell files.

global
New~1.9k
v1.0Saved Jul 3, 2026

Pester Should -*Should-* Migration

Convert classic Pester v5 assertions (Should -Be, space then parameter) to the new Pester v6 Should-* assertions (Should-Be, hyphen, no space).

Status: experimental / preview. Verified against Pester 6.0.0-rc2. The classic Should -Be style still works in v6, so migrate incrementally and keep the suite green.

Companion skill. This skill covers the optional move to the new Should-* operators. To upgrade a suite across major Pester versions (v3→v4→v5→v6 — the runtime, mocks, and config), use the separate pester-migration skill. In v6 the classic Should -Be keeps working, so adopting Should-* is independent of any version bump.

When to Use

  • Modernizing a Pester suite to the v6 Should-* assertions.
  • A user asks to migrate / convert / rewrite Should -... calls.
  • You want clearer, type-aware failure messages from the new assertions.

Know This First

  • Both syntaxes work side by side in Pester v6. Migration is optional and can be done one test (or one file) at a time. Nothing breaks if you leave some classic.
  • Requires Pester v6+. The Should-* commands do not exist in v5.
  • Negation is a separate command, not a -Not switch: Should -Not -BeShould-NotBe. There is no -Not parameter on the new assertions.
  • The actual value still comes from the pipeline ($x | Should-Be 1) or from -Actual (Should-Be -Actual $x -Expected 1). -Because carries over unchanged.
  • Most renames are mechanical, but several have behavior changes you must check by hand — see Gotchas.

Procedure

Step 1 — Find the classic assertions

Search the target for the classic space-separated syntax (the tell is Should -, or Should followed by -Not):

Should -          # any classic operator
Should -Not -     # negated classic operator
Assert-MockCalled # also removed in v6 -> Should-Invoke

Limit the scope to PowerShell test files (*.Tests.ps1, *.ps1).

Step 2 — Apply the mapping

Most-used conversions (full list in references/assertion-map.md):

Classic (v5) New (v6)
$x | Should -Be 1 $x | Should-Be 1
$x | Should -Not -Be 1 $x | Should-NotBe 1
$x | Should -BeExactly 'A' $x | Should-BeString 'A' -CaseSensitive
$x | Should -BeGreaterOrEqual 2 $x | Should-BeGreaterThanOrEqual 2
$x | Should -BeLessOrEqual 2 $x | Should-BeLessThanOrEqual 2
$x | Should -BeLike 'a*' $x | Should-BeLikeString 'a*'
$x | Should -Match 're' $x | Should-MatchString 're'
$x | Should -BeOfType [int] $x | Should-HaveType ([int])
$x | Should -BeNullOrEmpty depends — see gotchas (no single equivalent)
$c | Should -HaveCount 3 $c | Should-BeCollection -Count 3
$c | Should -Contain 2 $c | Should-ContainCollection 2
{ ... } | Should -Throw 'msg' { ... } | Should-Throw -ExceptionMessage 'msg'
Should -Invoke Get-Thing Should-Invoke Get-Thing
Should -InvokeVerifiable Should-Invoke -Verifiable

Step 3 — Check the behavioral gotchas (do NOT skip)

These do not translate by a plain rename. Read each before converting:

  1. Case sensitivity. Classic Should -Be is case-insensitive on strings; so is Should-Be. But classic Should -BeExactly (case-sensitive) has no plain equivalent — use Should-BeString -CaseSensitive. (Should-Be is never case-sensitive.) Same pattern for BeLikeExactlyShould-BeLikeString -CaseSensitive and MatchExactlyShould-MatchString -CaseSensitive.
  2. Truthy vs. true. Classic Should -BeTrue / -BeFalse accept any truthy / falsy value (1, 'x', 0, '', $null, @()). The new Should-BeTrue / Should-BeFalse are strict (exactly $true / $false). To preserve the old loose behavior use Should-BeTruthy / Should-BeFalsy. Only use the strict ones when the value really is a boolean.
  3. BeNullOrEmpty has no single equivalent. Pick by intent: $nullShould-BeNull; empty string → Should-BeEmptyString; empty collection → Should-BeCollection -Count 0; broad "falsy" → Should-BeFalsy. The negation Should -Not -BeNullOrEmpty similarly splits into Should-NotBeNull / Should-NotBeEmptyString / Should-NotBeWhiteSpaceString.
  4. Collections. Classic Should -Be also compares arrays; the new Should-Be is a value assertion and errors if -Expected is a collection ("You provided a collection to the -Expected parameter"). Use Should-BeCollection to compare arrays. Should -Contain (single-item membership) → Should-ContainCollection. The new command also takes a collection of expected items and checks they are all present, in the right order (1, 2, 3 | Should-ContainCollection @(1, 2)). For exact, whole-collection equality use Should-BeCollection instead.
  5. Pipeline unwrapping. The pipeline unwraps input: a value assertion sees @(1) as 1 and @() as $null, and a typed collection ([int[]]) is re-collected as [object[]]. When the exact value or concrete collection type matters (e.g. Should-HaveType), pass it with -Actual instead of piping.
  6. No Should-* equivalent. Should -Exist and the Should -FileContentMatch* family have no new counterpart. Either keep the classic assertion, or rewrite with PowerShell: Test-Path $p | Should-BeTrue, (Get-Content $p -Raw) | Should-MatchString 're'.
  7. Should -BeIn direction. No Should-BeIn. Reverse the operands: $value | Should -BeIn $collection$collection | Should-ContainCollection $value (note the actual/expected swap), or keep the classic form.

Step 4 — Verify

Run the suite and confirm it's still green — the new messages differ, but passes must stay passes:

Invoke-Pester -Path ./tests

If a converted assertion newly fails, re-check the gotchas above (most often #2 truthy/falsy, #3 null-or-empty, or #4 collections).

Step 5 — (Optional) Enforce the new style

Once a suite is fully migrated, switch off the classic syntax so it can't creep back:

$config = New-PesterConfiguration
$config.Should.DisableV5 = $true

With this set, any remaining Should -Be throws and points at the Should-Be form.

Output

Summarize what changed: files touched, count of assertions converted, any classic assertions intentionally left (e.g. Should -Exist), and any conversions that need a human decision (truthy/falsy, null-or-empty, collection semantics).

Reference

  • references/assertion-map.md — full operator-by-operator table with before/after examples and workarounds.
  • Live command reference: https://pester.dev/docs/commands/Should-Be (swap in any Should-* name) for exact parameters and examples.
  • Concepts: https://pester.dev/docs/assertions/should-command (value vs. collection assertions, pipeline vs. -Actual).
  • v5→v6 upgrade guide: https://pester.dev/docs/migrations/v5-to-v6.
Files2
2 files · 10.4 KB

Select a file to preview

Overall Score

87/100

Grade

A

Excellent

Safety

92

Quality

88

Clarity

85

Completeness

83

Summary

This skill guides agents through migrating Pester v5 assertion syntax (`Should -Be`) to the new Pester v6 `Should-*` syntax (`Should-Be`). It provides a structured 5-step procedure: finding classic assertions, applying a mapping table, checking behavioral gotchas (case sensitivity, truthiness, null-handling, collections), verifying test results, and optionally enforcing the new style. The skill includes a comprehensive reference table of all operator conversions and workarounds for assertions without direct v6 equivalents.

Detected Capabilities

file search and pattern matchingregex-based assertion detectioncode transformation guidancetest execution and validation

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

pester migrationshould assertion syntaxmodernize test suitev5 to v6assertion conversion

Referenced Domains

External domains referenced in skill content, detected by static analysis.

pester.dev

Use Cases

  • Migrate Pester test suites from v5 to v6 assertion style
  • Modernize existing test assertions to use hyphenated Should-* commands
  • Convert classic Should -Be syntax in .Tests.ps1 files
  • Handle behavioral differences between v5 and v6 assertion semantics
  • Enforce consistent assertion style across a test suite

Quality Notes

  • Well-structured procedure with clear step-by-step progression
  • Comprehensive gotchas section identifies 7 critical behavioral differences between v5 and v6
  • Complete assertion mapping table in reference file covers all operators with before/after examples
  • Clear guidance on which operators have no direct equivalent and workarounds provided
  • Emphasizes incremental migration and test verification to prevent regressions
  • Example code provided for most common conversion patterns
  • Practical output expectations defined (files touched, count of conversions, manual decisions)
  • Good separation of mechanical renames vs. behavioral changes requiring human review
Model: claude-haiku-4-5-20251001Analyzed: Jul 3, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Add github/pester-should-migration to your library

Command Palette

Search for a command to run...