c# - 起订量相当于 RhinoMocks 中的 LastCall 是什么?
问题描述
我正在升级到 .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();
...
}
任何有关理解 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。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();
将转换为最小起订量
Mock<IYourRepository> mockRepository = new Mock<IYourRepository>();
mockRepository.Verify(m=> m.NotVoidMethodName(It.IsAny<int>()), Times.AtLeastOnce());
推荐阅读
- ios - 如何隐藏 UIContextMenuInteraction/UITargetedPreview 黑色背景?
- javascript - 如何在 React 中每分钟自动获取数据?
- javascript - JS 在 `display: none` 和 `display: flex` 之间切换
- java - Java CompletableFuture 超时如何处理 GC?
- xcode - 是否可以扩展 MacOS Terminal.app?
- xml - 如何为xml中的每个节点添加相同的前缀?
- intellij-idea - 如何在 IntelliJ Idea 的代码样式设置中为循环内部配置不同的间距规则?
- excel - 如何在 Powershell 脚本中使用 VBA 代码
- html - 如何将网页屏幕水平分成3等份?
- spring - Spring Batch 两个不同结构的文件