Я перехожу на .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.





По ссылке 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());
Вы должны использовать 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();?