请参阅此代码:
TicketStoreService fakeTicketStoreService =
MockRepository.GenerateMock<TicketStoreService>();
fakeTicketStoreService.Expect(service => service.DoSomething(Arg.Is(new Guid()))
.Return(new Guid());
fakeTicketStoreService.DoSomething(Arg.Is(new Guid()));
fakeTicketStoreService.VerifyAllExpectations();
请注意,DoSomething
是从 NO 接口继承的自动生成类中的非虚拟方法调用。所以根据常识,它不应该起作用。但它确实如此。
问题是它是唯一可以做到这一点的(非商业)框架:
- Rhino.Mocks有效,验证也有效
- FakeItEasy 说它找不到默认构造函数(可能只是错误的异常消息):
No default constructor was found on the type SomeNamespace.TicketStoreService
- 最小起订量给出了一些理智和可以理解的东西:
Invalid setup on a non-virtual (overridable in VB) member: service=> service.DoSomething
- Nsubstitute给出一条消息
System.NotSupportedException: Cannot serialize member System.ComponentModel.Component.Site of type System.ComponentModel.ISite because it is an interface.
我真的很想知道框架是怎么回事,除了 Moq。"花哨的新"框架似乎也有最初的性能打击,可能准备了一些类型缓存和序列化的东西,而 RhinoMocks 以某种方式设法创建了一个非常"苗条"的模拟而没有递归。我不得不承认我不太喜欢RhinoMocks,但在这里它闪耀着光芒。不幸。
那么,有没有办法让它与更新的(非商业的!)模拟框架一起工作,或者以某种方式从 Rhino.Mocks 中得到一个理智的错误消息(描述我实际使用的 6 个参数中的哪一个在哪些方面有所不同)?为什么 Rhino.Mocks 可以做到这一点,当每个 Mocking 框架都明确表示它只能在给定具体类时与虚拟方法一起使用?
*我们不要通过谈论替代方法(如提取和覆盖)或运行时代理模拟框架(如 JustMock/TypeMock/Moles 或新的 Fakes 框架)来破坏讨论,我知道这些,但出于本主题之外的原因,这将是不太理想的解决方案。
您可以尝试Fody插件Virtuosity,它使用il weaving使所有成员都虚拟,因此任何基于动态代理的库都可以使用它。查看 Fody 示例,了解连接它所涉及的内容。
至于为什么 Rhino Mocks 有效,我无法得到它:
[Test]
public void FieldTest() {
var fakeTicketStoreService = MockRepository.GenerateMock<TicketStoreService>();
fakeTicketStoreService.Expect(service => service.DoSomething(Arg.Is(new Guid()))).Return(new Guid());
fakeTicketStoreService.DoSomething(Arg.Is(new Guid()));
fakeTicketStoreService.VerifyAllExpectations();
}
public class TicketStoreService {
public Guid DoSomething(Guid guid) { return guid; }
}
它失败并显示:
System.InvalidOperationException : Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#) / Overridable (VB) method).
at Rhino.Mocks.LastCall.GetOptions()
at Rhino.Mocks.RhinoMocksExtensions.Expect(T mock, Function`2 action)
看来这里还有其他事情发生。您是否能够发布一个独立的、最小的案例来重现这种情况?
最后,您提到的所有库都是开源的,因此选择您最喜欢的库并查看是否可以改善错误消息或性能会很棒。如果你之前没有为开源做出贡献,这似乎有点令人生畏,但项目中的人通常很乐意尝试帮助任何感兴趣的人。:)
- 最小起订量来源
- 假的容易来源
- N目录来源
- 犀牛嘲笑来源(我认为这是它现在的家)