Comparing Moq to FakeItEasy
I whipped up a little prototype that compares Moq syntax to FakeItEasy syntax. I prefer FakeItEasy's syntax and I will probably use it in future. But there's not enough difference in my opinion to warrant migrating from Moq to FakeItEasy on my current project.
Here's the code that compares using the two libraries:
public class Program
{
public static void Main()
{
TestFakeItEasyParameterMatching();
TestFakeItEasySequence();
TestMoqParameterMatching();
TestMoqSequence();
TestFakeItEasyAssert();
TestMoqAssert();
TestFakeItEasyEvent();
TestMoqEvent();
Console.ReadLine();
}
private static void TestFakeItEasyEvent()
{
var service = A.Fake<IService>();
service.ProcessedCalled += Raise.With<EventArgs>(EventArgs.Empty).Now;
}
private static void TestMoqEvent()
{
var mockService = new Mock<IService>();
mockService.Raise(eventExpression => eventExpression.ProcessedCalled += null, EventArgs.Empty);
}
private static void TestFakeItEasyAssert()
{
var service = A.Fake<IService>();
service.GetData(10);
A.CallTo(() => service.GetData(10)).MustHaveHappened();
A.CallTo(() => service.GetData(20)).MustNotHaveHappened();
}
private static void TestMoqAssert()
{
var mockService = new Mock<IService>();
mockService.Object.GetData(10);
mockService.Verify(ms => ms.GetData(10));
mockService.Verify(ms => ms.GetData(20), Times.Never());
}
private static void TestFakeItEasyParameterMatching()
{
IService service = A.Fake<IService>();
A.CallTo(() => service.GetData(A<int>.That.Matches((i) => i == 10))).Returns(20);
A.CallTo(() => service.GetData(30)).Returns(30);
Console.WriteLine("FakeItEasy: Return 20 if we call the method with 10: " + service.GetData(10));
Console.WriteLine("FakeItEasy: Return 30 if we call the method with 30: " + service.GetData(30));
}
private static void TestMoqParameterMatching()
{
var mockService = new Mock<IService>();
mockService.Setup(ms => ms.GetData(It.Is<int>(i => i == 10))).Returns(20);
mockService.Setup(ms => ms.GetData(30)).Returns(30);
Console.WriteLine("Moq: Return 20 if we call the method with 10: " + mockService.Object.GetData(10));
Console.WriteLine("Moq: Return 30 if we call the method with 30: " + mockService.Object.GetData(30));
}
private static void TestFakeItEasySequence()
{
IService service = A.Fake<IService>();
A.CallTo(() => service.GetData(A<int>.Ignored)).ReturnsNextFromSequence(10, 20, 30, 40, 50);
Console.WriteLine("FakeItEasy: sequence: " + service.GetData(10));
Console.WriteLine("FakeItEasy: sequence: " + service.GetData(10));
Console.WriteLine("FakeItEasy: sequence: " + service.GetData(10));
Console.WriteLine("FakeItEasy: sequence: " + service.GetData(10));
}
private static void TestMoqSequence()
{
var mockService = new Mock<IService>();
mockService.Setup(ms => ms.GetData(It.IsAny<int>())).Returns(new Queue<int>(new[] { 10, 20, 30, 40 }).Dequeue);
Console.WriteLine("Moq: sequence: " + mockService.Object.GetData(10));
Console.WriteLine("Moq: sequence: " + mockService.Object.GetData(10));
Console.WriteLine("Moq: sequence: " + mockService.Object.GetData(10));
Console.WriteLine("Moq: sequence: " + mockService.Object.GetData(10));
}
}