Repository navigation
Arguments in recursive expressions should not be treated like It.IsAny by default - #780
Merged
Merged
Conversation
In verification expressions of the kind `m => m.X(args).Y`, each arg- ument in `args` gets treated by `Verify` as if it were `It.IsAny<T>`.
Instead of just taking *any* inner mock setup that happens to be for the same method, try to pick one where argument expressions match too.
Now that we're more picky when choosing inner mock setups, we should also be more accurate when adding them. Otherwise, the only matches we'll ever get will be if all arguments use `It.IsAny<TArg>`, as that is the kind of inner mock setup generated by `DefaultValue.Mock`. This commit makes the tests pass that originally failed (_1 and _2), but it now breaks those using `It.IsAny` for verification (_3). This is an important breakage as it demonstrates a fundamental problem in the current recursive verification approach: In a verification call for `m => m.X.Y`, the inner mock `Y` to proceed to from `X` should not be chosen from `X`'s setups, but from the return values of all invoc- ations matching `X` (and there may be several different ones)!
Recorded invocations' return values are used to discover a full mocked object graph. The split verification expression can then be distribu- ted over those objects, and each one reports the number of matching invocations, which are then summed up. We also need to deal with error messages, too, which contain informa- tion about all actual invocations. We show all invocations of all dis- covered mocks in a flattened list, grouped by the mock on which they occurred, sorted in the order in which those mocks were discovered (i.e. by their approximate distance from the root object).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This improves the accuracy with which Moq matches invocations against recursive / fluent verification expressions when using
mock.Verify(expression). Error messages likewise contain more precise & more complete information about which invocations occurred, and on what (inner) mocks.Here's an example of what call verification error message will look like when this gets merged: