我要升级到.Net Core,因为它支持.Net Standard,因此涉及将许多单元测试从RhinoMocks转换为Moq。

我一直在通过重复最近的模拟调用来转换LastCall,但是我感到困惑,因为我有一个单元测试,其中LastCall.Throw(Exception);会在任何模拟调用之前发生。

据我了解LastCall,it allows you to do something additional to the last call that was added,但我知道我不了解某些内容,因为在我看来,LastCall不能在至少一个模拟呼叫之前出现。

单元测试如下所示:

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


在理解RhinoMocks的LastCall或如何将其转换为Moq方面的任何帮助将不胜感激。

最佳答案

在链接https://www.codeproject.com/Articles/11294/Rhino-Mocks-2-2#Capabilities中,
以下是一些要注意的重要点。


  我们将Expect.Call()用于具有返回值的方法,并且
  LastCall用于返回void以获取IMethodOptions的方法
  接口。我发现Expect.Call()语法更加清晰,但是有
  两者之间没有实际区别。
  
  我建议尽可能使用Expect(任何返回的内容
  一个值)。对于属性设置器或返回void的方法,
  Expect语法不适用,因为没有返回值。
  
  因此,需要LastCall。最后通话的想法无处不在
  记录状态,您只能设置最后一个的方法选项
  调用-甚至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());

关于c# - Moq在RhinoMocks中相当于LastCall吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56332207/

10-10 07:52