Pester Should Migration
GitHubOfficialFirst committed by nohwndDistributed by GitHub
- Skill
- Workflow
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured procedure for updating Pester test suites from the classic v5 space-separated assertion syntax (e.g., Should -Be) to the new Pester v6 hyphenated syntax (e.g., Should-Be). Because Pester v6 supports both styles, this migration can be performed incrementally. The process involves identifying classic assertions, applying the correct mapping, and carefully handling behavioral differences—particularly regarding truthiness, null/empty checks, and collection handling—to ensure tests remain accurate.
What it does
- Identifies classic Pester v5 assertion patterns in PowerShell test files.
- Maps legacy space-separated operators to modern Pester v6 hyphenated commands.
- Provides guidance on handling behavioral changes like strict boolean checks.
- Offers strategies for replacing deprecated assertions like BeNullOrEmpty.
- Includes steps to verify test suite integrity after migration.
- Supports optional configuration to enforce the new syntax and prevent regression.
When to use it
- When modernizing a Pester test suite to leverage Pester v6 features.
- When you want to adopt the clearer, type-aware failure messages of v6 assertions.
- When you need to convert legacy Should -... calls in existing .Tests.ps1 files.
- When you are performing an incremental upgrade of a test suite to Pester v6.
Advantages
- Allows for incremental, file-by-file migration without breaking the test suite.
- Improves test readability and provides more descriptive failure messages.
- Enables strict type checking for boolean assertions.
- Provides a clear path to deprecate legacy syntax using Pester configuration.
Usage examples
- “Migrate my Pester v5 tests in ./tests to the new v6 Should-* syntax.”
- The agent will scan the specified directory, identify classic assertions like Should -Be, and suggest the corresponding Should-Be replacements while highlighting potential behavioral gotchas.
- “How do I convert Should -Not -Be to Pester v6?”
- The agent will explain that negation is now a dedicated command and provide the conversion: Should -Not -Be becomes Should-NotBe.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/github/pester-should-migration/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip pester-should-migration.zip -d .agents/skills
Documentation by nohwnd
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 -Bestyle 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 classicShould -Bekeeps working, so adoptingShould-*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
-Notswitch:Should -Not -Be→Should-NotBe. There is no-Notparameter 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).-Becausecarries 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-InvokeLimit 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:
Case sensitivity. Classic
Should -Beis case-insensitive on strings; so isShould-Be. But classicShould -BeExactly(case-sensitive) has no plain equivalent — useShould-BeString -CaseSensitive. (Should-Beis never case-sensitive.) Same pattern forBeLikeExactly→Should-BeLikeString -CaseSensitiveandMatchExactly→Should-MatchString -CaseSensitive.Truthy vs. true. Classic
Should -BeTrue/-BeFalseaccept any truthy / falsy value (1,'x',0,'',$null,@()). The newShould-BeTrue/Should-BeFalseare strict (exactly$true/$false). To preserve the old loose behavior useShould-BeTruthy/Should-BeFalsy. Only use the strict ones when the value really is a boolean.BeNullOrEmptyhas no single equivalent. Pick by intent:$null→Should-BeNull; empty string →Should-BeEmptyString; empty collection →Should-BeCollection -Count 0; broad "falsy" →Should-BeFalsy. The negationShould -Not -BeNullOrEmptysimilarly splits intoShould-NotBeNull/Should-NotBeEmptyString/Should-NotBeWhiteSpaceString.Collections. Classic
Should -Bealso compares arrays; the newShould-Beis a value assertion and errors if-Expectedis a collection ("You provided a collection to the -Expected parameter"). UseShould-BeCollectionto 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 useShould-BeCollectioninstead.Pipeline unwrapping. The pipeline unwraps input: a value assertion sees
@(1)as1and@()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-Actualinstead of piping.No
Should-*equivalent.Should -Existand theShould -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'.Should -BeIndirection. NoShould-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 ./testsIf 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 = $trueWith 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 anyShould-*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.
Files
- ATTRIBUTION.mdAdded by AutoGineer875 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md7.7 KiB
- references/assertion-map.md9.3 KiB
Requirements and compatibility
Written for: GitHub Copilot, Claude Code
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Claude Code frontmatter
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- First committed by
nohwnd
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/pester-should-migration · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- nohwnd
AutoGineer is not affiliated with or endorsed by nohwnd or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download pester-should-migration.zip