-
-
Notifications
You must be signed in to change notification settings - Fork 478
Description
Checklist
- Issue has a meaningful title
- I have searched the existing issues. See all issues
- I have tested using the latest version of Pester. See Installation and update guide.
What is the issue?
I’m seeing what looks like an issue with how -Verifiable mocks behave when they are overridden in a narrower scope.
Summary
If a mock is defined as -Verifiable in an outer scope (e.g., Describe/Context) and then a different mock for the same command is defined in an inner scope (e.g., inside an It block) also marked -Verifiable, the inner mock is correctly used for the call, but Should -InvokeVerifiable fails.
If I remove -Verifiable from the outer mock, then overriding the mock in It works and Should -InvokeVerifiable passes.
This makes it difficult to have a default verifiable mock for most tests, while overriding it for specific tests.
Workaround
If I remove -Verifiable from the outer mock (leave it only on the inner mock), the override test passes.
Thank you.
Expected Behavior
When a mock is overridden in a narrower scope:
The overridden (inner) verifiable mock should be the one that needs to be “verified”.
The outer verifiable mock should either be considered shadowed/ignored for verification purposes, or automatically treated as not applicable in that It run.
Therefore, Should -InvokeVerifiable should pass when the effective mock(s) for the test were invoked.
Actual behavior
The call goes to the overridden mock in It (confirmed by return value / debug output).
Should -InvokeVerifiable fails anyway, apparently because the outer -Verifiable mock is still tracked as “not invoked”, even though it was overridden and could never be invoked in that test.
Steps To Reproduce
Minimal reproduction
Describe 'Verifiable mock overriding' {
BeforeAll {
function Get-Data { 'real' }
}
Context 'default mock in outer scope' {
It 'uses default and passes' {
Get-Data | Should -Be 'outer-mock'
Should -InvokeVerifiable
}
It 'overrides mock inside It but InvokeVerifiable fails' {
# Override for this specific test
Mock Get-Data { 'inner-mock' } -Verifiable
# Confirm the override is actually used
Get-Data | Should -Be 'inner-mock'
# This fails (even though the inner verifiable mock was invoked)
Should -InvokeVerifiable
}
}
}
Describe your environment
No response
Possible Solution?
No response