How to replace the Moq framework with FakeItEasy in your unit-tests codebase
When working with unit tests in .NET, you might find yourself using the Moq framework to create mock objects. However, there are alternative frameworks like FakeItEasy that offer similar functionalities using a different approach. In this article, we’ll explore how to replace Moq with FakeItEasy, focusing on the following changes:
- Instantiating a New Mock
- Setting up / Mocking the response of a method
- Setting up properties
- Passing the Mock as a parameter to a class
- Replacing the Protected method of Moq
- Verifying method calls
1. Instantiating a New Mock
In Moq, you create a new mock object using the Mock<T>
class:
var mock = new Mock<IMyService>();
In FakeItEasy, you create a new fake object using the A.Fake<T>
method:
var fake = A.Fake<IMyService>();
2. Setting up / Mocking the response of a method
In Moq, you set up a method using the Setup
method:
mock.Setup(x => x.MyMethod()).Returns("Hello, World!");
In FakeItEasy, you set up a method using the A.CallTo
method:
A.CallTo(() => fake.MyMethod()).Returns("Hello, World!");
For defining the values of parameters of the mocked methods:
- The equivalent of
It.IsAny<string>
in Moq isA<string>.Ignored
orA<string>._Ignored_
in FakeItEasy. - The equivalent of
It.Is(x => "Hello, World!")
isA<string>.That.Matches(x => x == "Hello, World!")
3. Setting Up Properties
In Moq, you set up properties using the SetupProperty method:
mock.SetupProperty(x => x.MyProperty, "InitialValue");
In FakeItEasy, you set up properties using the A.CallToSet method:
A.CallToSet(() => fake.MyProperty).To("InitialValue");
4. Passing the Mock as a parameter to a class
In Moq, you pass the mock object as a parameter using the .Object
property:
var service = new MyService(mock.Object);
In FakeItEasy, you can pass the fake object directly without any additional properties:
var service = new MyService(fake);
5. Replacing the Protected method of Moq
In Moq, you can access protected members using the Protected
method:
mock.Protected().Setup<string>("MyProtectedMethod").Returns("Hello, World!");
In FakeItEasy, there is no direct equivalent to Moq’s Protected
. Instead, you can use the A.CallTo method with a lambda expression that accesses the protected member through a derived class:
var fake = A.Fake<MyService>();
A.CallTo(() => fake.MyProtectedMethod()).Returns("Hello, World!");
6. Verifying method calls
In Moq, you verify that a method was called using the Verify
method:
mock.Verify(x => x.MyMethod(), Times.Once);
In FakeItEasy, you verify that a method was called using the A.CallTo
method with the MustHaveHappened
assertion:
A.CallTo(() => fake.MyMethod()).MustHaveHappenedOnceExactly();
Conclusion
Replacing Moq with FakeItEasy involves some changes in how you instantiate mocks, set up methods, pass mocks as parameters, and handle protected members. By following the examples provided, you can smoothly transition from Moq to FakeItEasy.