Что такое эквивалент Moq для LastCall в RhinoMocks?

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

Я преобразовывал 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
347
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

We use the Expect.Call() for methods that has return values, and LastCall for methods that return void to get the IMethodOptions interface. I find the Expect.Call() syntax a bit clearer, but there is no practical difference between the two.

I would recommend using Expect wherever possible (anything that return a value). For properties setters, or methods returning void, the Expect syntax is not applicable, since there is no return value.

Thus, the need for the LastCall. The idea of Last Call is pervasive in the record state, you can only set the method options for the last call - even Expect.Call() syntax is merely a wrapper around 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());

Просто чтобы убедиться, что я понимаю, правильно ли будет сказать, что что-то вроде LastCall.Repeat.AtLeastOnce(); будет преобразовано в Moq как Mock<IYourRepository> mockRepository = new Mock<IYourRepository>(); mockRepository.Setup(m=> m.NotVoidMethodName(It.IsAny<int>())).Verifiable();?

AbsoluteSpace 28.05.2019 16:59

Вы должны использовать Mock<IYourRepository> mockRepository = new Mock<IYourRepository>(); mockRepository.Verify(m=> m.NotVoidMethodName(It.IsAny<int>()), Times.AtLeastOnce()); Обновил пост с учетом вашего комментария.

Anoop H.N 29.05.2019 07:10

Другие вопросы по теме