我有一个对象,我正在尝试使用moq进行模拟。对象的构造函数具有必需参数:
public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}
现在我正在尝试使用moq的v3“setup”或v4“Mock.Of”语法为这个对象创建模拟但是无法解决这个问题......我正在尝试的一切都没有验证。这是我到目前为止所拥有的,但最后一行是给我一个真实的对象,而不是模拟。我这样做的原因是因为我想要验证的CustomerSyncEngine上有方法被调用...
// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();
// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);
答案 0 :(得分:54)
将最后一行更改为
var syncEngine = new Mock<CustomerSyncEngine>(mockLogger, mockCrm, mockCache).Object;
它应该有效
答案 1 :(得分:28)
最后一行是为您提供一个真实实例,因为您使用的是new关键字,而不是模拟CustomerSyncEngine。
您应该使用Mock.Of<CustomerSyncEngine>()
Mocking Concrete类型的唯一问题是Moq需要一个公共默认构造函数(没有参数)或者您需要使用构造函数arg规范创建Moq。 http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html
最好的办法是右键单击您的班级并选择Extract interface。