перенести модульные тесты, написанные с помощью NMock2, в Moq
Меня просят обновить очень старую кодовую базу до .net 6, и после обновления модульные тесты больше не проходят, потому что фиктивная библиотека NMock2 не поддерживает .net 6. Я пытаюсь заменить старую фиктивную библиотеку на Moq, но столкнулся с новыми проблемами. Поскольку я не эксперт ни в одной из библиотек, может ли кто-нибудь помочь мне с обновлением?
tl;dr Каковы эквивалентыExpect.Exactly(3).On(aHandlerMock).Method("APublicMethod").WithAnyArguments()
иExpect.Exactly(2).On(aHandlerMock).GetProperty("AOnlyGetterAvailableProperty").Will(Return.Value(false))
Подробности проблемы:
Тестовый класс с задействованным NMock2 выглядит так:
[SetUp]
public void SetUp()
{
this.mockery = new Mockery();
this.messageDelegatorMock = this.mockery.NewMock<IDispatcher>();
this.xHandlerFactoryMock = this.mockery.NewMock<IXHandlerFactory>();
this.xHandlerMock = this.mockery.NewMock<IXHandler>();
this.incomingXDelegate = new IncomingXDelegate(this.messageDelegatorMock)
{
XHandlerFactory = this.xHandlerFactoryMock
};
}
[Test]
public void TestHandleXSimple()
{
TestX testX = new TestX(new Collection<string>());
CY y1 = new CY("1", 0, false);
CY y2 = new CY("1", 1, false);
CY y3 = new CY("1", 2, true);
Expect.Once.On(this.xHandlerFactoryMock)
.Method("createXHandler")
.With(typeof(TestX), "1")
.Will(Return.Value(this.xHandlerMock));
Expect.Exactly(3).On(this.xHandlerMock)
.Method("addMessage")
.WithAnyArguments();
Expect.Exactly(2).On(this.xHandlerMock)
.GetProperty("IsComplete")
.Will(Return.Value(false));
Expect.Once.On(this.xHandlerMock)
.GetProperty("IsComplete")
.Will(Return.Value(true));
Expect.Once.On(this.XHandlerMock)
.GetProperty("Message")
.Will(Return.Value(testX));
Expect.Once.On(this.messageDelegatorMock).Method("Dispatch");
incomingXDelegate.OnX(testX, y1);
incomingXDelegate.OnX(testX, y2);
incomingXDelegate.OnX(testX, y3);
mockery.VerifyAllExpectationsHaveBeenMet();
}
addMessage(object message, IMh info)
объявлен вIXHandler
а в тестовом приспособлении классCY
реализуетIMh
.
Мой вопрос: как я могу использовать Moq для имитации поведения NMock2 в примере? Большое спасибо за вашу щедрую помощь!
1 ответ
У меня нет опыта работы с NMock2, но этот код кажется довольно явным в том, что он ожидает.
Учитывая это и предполагая, что тестируемый класс выглядит следующим образом:
public interface IXHandlerFactory
{
void APublicMethod(int argOne, int argTwo);
bool AOnlyGetterAvailableProperty { get; }
}
Expect.Exactly(3).On(aHandlerMock).Method("APublicMethod").WithAnyArguments()
Будет выглядеть так:
//Create the mock and call the method as an example
var mock = new Mock<IXHandlerFactory>();
mock.APublicMethod(1, 2);
//Verify the method was called the expected number of times with any value
//for the arguments
mock.Verify(x => x.APublicMethod(It.IsAny<int>(), It.IsAny<int>()), Times.Exactly(3));
The Times
class в Moq имеет кучу полезных методов для указания того, как часто (если вообще) вызывается ожидаемый метод. Если ожидание не соответствует, будет выдано исключение, которое обычно не проходит тест в фреймворках, с которыми я работал в прошлом.
The It
класс также имеет кучу методов, таких какAny
(т.е. мне все равно, какое значение) или, если вы хотите быть более конкретным, естьIs
где вы можете подключить пользовательское сравнение.
Expect.Exactly(2).On(aHandlerMock).GetProperty("AOnlyGetterAvailableProperty").Will(Return.Value(false))
будет выглядеть так:
//Create the mock as before
var mock = new Mock<IXHandlerFactory>();
//Any calls to AOnlyGetterAvailableProperty will return false
mock.Setup(x => x.AOnlyGetterAvailableProperty).Returns(false);
//Run the test
//Assert the expectation
mock.Verify(x => x.AOnlyGetterAvailableProperty, Times.Exactly(2));