По ссылке 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());