【问题标题】:What is Moq's equivalent of LastCall in RhinoMocks?起订量相当于 RhinoMocks 中的 LastCall 是什么?
【发布时间】:2019-10-13 09:24:24
【问题描述】:

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

我一直在通过重复最近的模拟调用来转换 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 的帮助将不胜感激。

【问题讨论】:

    标签: c# unit-testing moq rhino-mocks


    【解决方案1】:

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

    我们将 Expect.Call() 用于具有返回值的方法,并且 LastCall 用于返回 void 以获取 IMethodOptions 的方法 界面。我发现 Expect.Call() 语法更清晰一些,但是有 两者之间没有实际区别。

    我建议尽可能使用 Expect(任何返回 一个值)。对于属性设置器或返回 void 的方法, Expect 语法不适用,因为没有返回值。

    因此,需要LastCall。 Last Call 的概念在 记录状态,只能设置最后一个的方法选项 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());
    

    【讨论】:

    • 只是为了确保我理解,说LastCall.Repeat.AtLeastOnce(); 之类的东西将转换为Mock&lt;IYourRepository&gt; mockRepository = new Mock&lt;IYourRepository&gt;(); mockRepository.Setup(m=&gt; m.NotVoidMethodName(It.IsAny&lt;int&gt;())).Verifiable(); 的起订量是否正确?
    • 你应该使用,Mock mockRepository = new Mock(); mockRepository.Verify(m=> m.NotVoidMethodName(It.IsAny()), Times.AtLeastOnce());更新了帖子以解决您的评论。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2023-03-03
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多