Don't require a verifiable mock that an inner-scope default mock shadows - #2751
Don't require a verifiable mock that an inner-scope default mock shadows#2751nohwnd wants to merge 2 commits into
Conversation
…t mock shadows A mock marked -Verifiable in an outer scope that is overridden by a mock for the same command in a narrower scope could never pass Should -InvokeVerifiable, because Get-VerifiableBehaviors still collected the outer behavior and reported it as never invoked even though the inner mock handled every call. Walk the scopes from the test outwards and drop a verifiable behavior when a closer scope has a default mock (no -ParameterFilter) for the same command. A verifiable mock that isn't shadowed is still required. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Picked this back up. Merged The repro in #2672 is missing the outer
One shape I got wrong on the first try, worth writing down so nobody else chases it: an outer verifiable mock with a Also worth knowing: the bug only shows when the outer verifiable mock is never invoked before the overriding test. If an earlier
Marking ready for review. 🤖 |
Fix #2672
A mock marked
-Verifiablein an outer scope (Describe/Context) that you then override with another mock for the same command in an inner scope (It) could never passShould -InvokeVerifiable: the inner mock handled the call, butGet-VerifiableBehaviorsstill collected the outer one and reported it as never invoked.Get-VerifiableBehaviorsnow walks the scopes from the test outwards and drops a verifiable behavior when a closer scope has a default mock (one without a-ParameterFilter) for the same command - that default catches every call, so the outer behavior can't run and shouldn't be required. A verifiable mock that isn't shadowed like that is still required, same as before.