【发布时间】:2012-06-26 08:53:23
【问题描述】:
查看此代码:
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.
我真的很想知道除了最小起订量之外的框架是怎么回事。 “花哨的新”框架似乎也有一个初步的性能命中,可能准备了一些类型缓存和序列化的东西,而 RhinoMocks 不知何故设法创建了一个非常“苗条”的模拟而没有递归。我不得不承认我不太喜欢 RhinoMocks,但它在这里闪耀……不幸的是。
那么,有没有办法让它与更新的(非商业!)模拟框架一起工作,或者以某种方式得到一个理智的错误消息(描述我实际使用的 6 个参数中的哪一个是不同的? ) 出 Rhino.Mocks?为什么 Rhino.Mocks 可以做到这一点,而每个 Mocking 框架都明确表示它只能在给定具体类的情况下使用虚拟方法?
*我们不要通过讨论诸如 Extract&Override 之类的替代方法或 JustMock/TypeMock/Moles 之类的运行时代理 Mocking 框架或新的 Fakes 框架来破坏讨论,我知道这些,但由于除此之外的原因,这不是理想的解决方案主题。
【问题讨论】:
-
MockRepository 返回 Mock
?如果是起订量? -
@Anton no, Mock
,因为 TicketStoreService 是一个生成的服务,没有从接口派生.. mock 的行为是可以理解的,问题是:为什么 RhinoMocks 工作,为什么不能其他框架可以吗?
标签: mocking moq rhino-mocks fakeiteasy nsubstitute