By looking at the error message, you can immediately see what is wrong. This is not correct. The contract defined by Invocation is that the Return methods should ensure that these get properly written back for the calling code. In addition, there are higher chances that you will stumble upon Fluent Assertions if you join an existing project. While method chaining usually works on a simple set of data, fluent interfaces are usually used to modify a complex object. An invoked method can also have multiple parameters. You can use any matcher(s) you want, including custom ones (such as It.Is(arg => condition(arg))). The Great Debate: Integration vs Functional Testing. If that's indeed what you're struggling with, please see #531 (comment).). If the method AddPayRoll () was never executed, test would fail. Assertions to check logic should always be true Assertions are used not to perform testing of input parameters, but to verify that program flow is corect i.e., that you can make certain assumptions about your code at a certain point in time. If you ask me, this isn't very productive. We have to rerun the failing test(s) multiple times to get the full picture. You can also perform assertions on multiple methods or properties in a certain type by using the Methods() or Properties() extension methods and some optional filtering methods. I haven't thought about it in detail, but the publicly visible Mock.Invocations would ideally appear to be a IReadOnlyList, where the interface type IInvocation defines two properties MethodInfo Method { get; } and IReadOnlyList