Что такое Moq-эквивалент LastCall в RhinoMocks? - PullRequest
2 голосов
/ 27 мая 2019

Я обновляюсь до .Net Core, который включает преобразование ряда модульных тестов из RhinoMocks в Moq, поскольку он поддерживает стандарт .Net.

Я конвертировал LastCall, повторяя самый последний смоделированный вызов,но я сбит с толку, потому что у меня есть модульный тест, в котором LastCall.Throw(Exception); происходит до того, как выполняются какие-либо поддельные вызовы.

Как я понимаю LastCall, позволяет вам сделать что-то дополнительное к последнему добавленному вызову, но я знаю, что чего-то не понимаю, потому что, по-моему, LastCall не может прийти раньше, чем хотя бы один поддельный вызов.

Модульный тест выглядит примерно так:

MockRepository mock = new MockRepository();
 ...
using (mocks.Record())
{
    nonMockedObject.DoSomething();
    LastCall.Throw(Exception);
    Expect.Call(mockedObject.Stuff()).Return(true).Repeat.Any();
    ...
}

Любая помощь в понимании LastCall RhinoMocks или как преобразовать его в Moq будет принята с благодарностью.

1 Ответ

2 голосов
/ 28 мая 2019

По ссылке https://www.codeproject.com/Articles/11294/Rhino-Mocks-2-2#Capabilities, Ниже приведены некоторые важные моменты, на которые следует обратить внимание.

Мы используем Expect.Call () для методов с возвращаемыми значениями и LastCall для методовэто возвращение void, чтобы получить интерфейс IMethodOptions.Я нахожу синтаксис Expect.Call () немного более понятным, но между ними нет практической разницы.

Я бы рекомендовал использовать Expect везде, где это возможно (все, что возвращает значение).Для установщиков свойств или методов, возвращающих void, синтаксис Expect не применяется, поскольку возвращаемого значения нет.

Таким образом, нужен LastCall.Идея Last Call распространена в состоянии записи, вы можете установить параметры метода только для последнего вызова - даже синтаксис Expect.Call () является просто оболочкой для LastCall.

Заключение : не используйте LastCall внутри состояния записи.Когда вы переходите с RhinoMocks на Moq, вы можете игнорировать LastCall.

Переходя к общедоступному коду, вы можете макетировать функции, которые возвращают значение, используя moq, как показано ниже,

Mock<IYourRepository> mockRepository = new Mock<IYourRepository>();
mockRepository.Setup(m=> m.YourMethodName(It.IsAny<int>())).Returns(new List<string>());
mockRepository.Setup(m=> m.YourMethodName(It.Is<int>(x=> x == 0)).Throws<ArgumentException>();

Для методов, которые ничего не возвращают, вы можете установить, как показано ниже,

Mock<IYourRepository> mockRepository = new Mock<IYourRepository>();
mockRepository.Setup(m=> m.YourVoidMethodName(It.IsAny<int>())).Verifiable();;
mockRepository.Setup(m=> m.YourVoidMethodName(It.IsAny<int>())).Throws<Exception>();
mockRepository.Setup(m=> m.YourAsyncVoidMethodName(It.IsAny<int>())).Returns(Task.Completed); // public async Task YourAsyncVoidMethodName(){}

Для ответа на комментарий

LastCall.Repeat.AtLeastOnce(); будет преобразовано в Moq как

Mock<IYourRepository> mockRepository = new Mock<IYourRepository>(); 
mockRepository.Verify(m=> m.NotVoidMethodName(It.IsAny<int>()), Times.AtLeastOnce());
...