When I want to verify that in one method a mock object is receiving some messages in a particular order I do something like this:
// sut is an instance of the class I am testing and myMock is a mock object injected in sut.
// I want to test that myMock sends messageA and then messageB, in that particular order.
[[[myMock expect] andDo:^(NSInvocation *invocation)
{
[[myMock expect] messageB];
}]
messageA];
[sut methodToTest];
[myMock verify];
Is there any cleaner/better way of doing this? Thanks in advance.
You can use setExpectationOrderMatters
[myMock setExpectationOrderMatters:YES];
[[myMock expect] messageA];
[[myMock expect] messageB];
[sut methodToTest];
[myMock verify];
That looks pretty clean to me. If you're not happy nesting, you could introduce a block variable.
__block BOOL hasCalledA;
[[[myMock expect] andDo:^(NSInvocation *invocation) {
hasCalledA = YES;
}] messageA];
[[[myMock expect] andDo:^(NSInvocation *invocation) {
STAssertTrue(hasCalledA);
}] messageB];
You solution looks fine though.
As a side note, I think this question might be better suited for https://codereview.stackexchange.com/ although I'm still wrapping my head around that site.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With