перенести модульные тесты, написанные с помощью 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 Timesclass в 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));
Другие вопросы по тегам