Mocking 生成的服务模拟:除了Rhinomock之外的所有东西都失败了?

Mocking 生成的服务模拟:除了Rhinomock之外的所有东西都失败了?,mocking,moq,rhino-mocks,fakeiteasy,nsubstitute,Mocking,Moq,Rhino Mocks,Fakeiteasy,Nsubstitute,请参阅此代码: TicketStoreService fakeTicketStoreService = MockRepository.GenerateMock<TicketStoreService>(); fakeTicketStoreService.Expect(service => service.DoSomething(Arg.Is(new Guid()))

请参阅此代码:

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();
TicketStoreService fakeTicketStoreService=
MockRepository.GenerateMock();
fakeTicketStoreService.Expect(service=>service.DoSomething(Arg.Is(new Guid()))
.Return(新Guid());
DoSomething(Arg.Is(new Guid());
fakeTicketStoreService.verifyallexpections();
请注意,
DoSomething
是自动生成类中的非虚拟方法调用,该类不从任何接口继承。
因此,根据常识,它不应该起作用。但它确实起作用。

问题是,它是唯一一个(非商业)框架可以做到这一点:

  • 模仿是有效的,验证也是有效的
  • Fakeitesy说它找不到默认构造函数(可能只是错误的异常消息):
    在SomeNamespace类型上找不到默认构造函数。TicketStoreService
  • Moq提供了一些合理且可理解的信息:
    非虚拟(在VB中可重写)成员上的设置无效:service=>service.DoSomething
  • NSSubstitute给出一条消息
    System.NotSupportedException:无法序列化System.ComponentModel.Component.Site类型为System.ComponentModel.ISite的成员System.ComponentModel.Site,因为它是一个接口。
我真的很想知道除了Moq之外,这些框架到底发生了什么。这些“新奇”的框架似乎也有一个最初的性能冲击,可能是准备了一些类型缓存和序列化的东西,而RhinoMocks不知何故设法创建了一个非常“苗条”的框架没有递归的mock。我不得不承认我不太喜欢rhinomock,但它在这里闪耀着光芒。不幸的是

那么,有没有一种方法可以让它与较新的(非商业的!)模拟框架一起工作,或者以某种方式得到一条合理的错误消息(描述我实际使用的6个参数中的哪一个在哪一方面不同)走出Rhino.Mocks?为什么Rhino.Mocks能够做到这一点,而每个模拟框架都明确指出,当给定一个具体的类时,它只能与虚拟方法一起工作?


*我知道这些,但由于本主题之外的原因,这将是不太理想的解决方案。

您可以尝试使用Fody插件,使所有成员都成为虚拟用户GIL编织,因此任何基于动态代理的库都可以使用它。请检查连接此程序所涉及的内容

至于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; }
}
看起来这里还发生了其他事情。你能发布一个独立的,最小的案例来重现这个吗

最后,您提到的所有库都是开源的,所以最好选择您最喜欢的库,看看是否可以改进错误消息或性能。如果您以前没有对开源做出过贡献,这可能会让人感到有点畏缩,但参与项目的人通常都非常乐意尝试帮助对合作感兴趣的人分配:)

  • (我想这是它现在的家)

您可以尝试使用Fody插件,该插件使用il-weaving将所有成员虚拟化,因此任何基于动态代理的库都可以使用它。检查连接此连接所涉及的内容

至于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; }
}
看起来这里还发生了别的事情。你能发布一个独立的,最小的案例来复制这个吗

最后,您提到的所有库都是开源的,因此最好选择您最喜欢的库,看看是否可以改进错误消息或性能。如果你以前没有对开源做出过贡献,这看起来有点让人望而生畏,但参与项目的人通常非常乐意尝试帮助任何有兴趣贡献的人。:)

  • (我想这是它现在的家)

MockRepository返回Mock?对于Moq?@Anton no,Mock,因为TicketStoreService是一个生成的服务,没有从接口派生。。mock的行为是可以理解的,问题是:为什么rhinomock工作,为什么其他框架不能这样做?MockRepository返回mock?对于Moq?@Anton no,Mock,因为TicketStoreService是一个生成的服务,没有从接口派生。。mock的行为是可以理解的,问题是:为什么Rhinomock可以工作,为什么其他框架不能这样做?答案很好,不幸的是,我现在不能将其标记为正确,因为它不能回答Rhinomock为什么在那里工作的问题,但Fody看起来很好,我认为我在这里没有发现什么新的东西。我用一个封装服务调用的包装器解决了这个问题,无论如何都要更干净(NSubstitute error messages>>rhinomock error messages),但当然是+1,并且在我确定没有其他人加入时接受答案;)我很乐意尝试一下为什么Rhino Mocks适用于您的案例,但您需要发布一个可运行的示例,因为我无法复制它。:)当我有时间的时候,我会尝试这样做,不幸的是,服务类本身是一个非常大的部分类,所以我不得不逐步地将其剥离。。再说一次,我会在找到时间后再做。:)很好的回答,不幸的是,我现在无法将它标记为正确的,因为它无法回答RhinoMocks为什么在那里工作的问题,但是Fody看起来很好,我认为我在这里没有发现新的东西。我用一个封装服务调用的包装器解决了这个问题,无论如何都要更干净(NSubstitute error messages>>rhinomock error messages),但当然是+1,并且在我确定没有其他人加入时接受答案;)我很乐意尝试一下为什么Rhino Mocks适用于您的案例,但您需要发布一个可运行的示例,因为我无法复制