Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the FakeItEasy equivalent of the Moq VerifyNoOtherCalls() method

Tags:

c#

moq

fakeiteasy

I'm currently a Moq user and I'm researching other mocking frameworks.

When unit testing I frequently call _mock.VerifyNoOtherCalls() so I can be certain there are no unexpected interactions beyond the ones that I have already verified.

I've searched the FakeItEasy docs and cannot find the equivalent option in their framework. Can anyone suggest how I might do this?

like image 486
TheCrimsonSpace Avatar asked Oct 26 '18 09:10

TheCrimsonSpace


1 Answers

Strict fakes

FakeItEasy supports strict fakes (similar to strict mocks in Moq):

var foo = A.Fake<IFoo>(x => x.Strict());

This will fail the moment an unexpected call is made.

Semi-strict fakes

It is also possible to configure all calls directly:

A.CallTo(fakeShop).Throws(new Exception());

and combine this with specifying different behaviors for successive calls, however in this case, there's no benefit to doing so over using a strict fake, as a strict fake will give better messages when unconfigured methods are called. So if you want to configure some methods to be called a limited number of times, you could

var fakeShop = A.Fake<IShop>(options => options.Strict());
A.CallTo(() => fakeShop.GetTopSellingCandy()).Returns(lollipop).Once();
A.CallTo(() => fakeShop.Address).Returns("123 Fake Street").Once();

fakeShop.GetTopSellingCandy() and fakeShop.Address can be called once, the second time it will fail.

Arbitrary checks

If you want to check if no calls are made at arbitrary points in the test:

A.CallTo(fakeShop).MustNotHaveHappened();

It might be better to filter out some of the methods that can be executed while debugging:

A.CallTo(a)
 .Where(call => call.Method.Name != "ToString")
 .MustNotHaveHappened();

You don't want a failing test because you hovered over the variable.

like image 159
Jeroen Avatar answered Oct 15 '22 18:10

Jeroen