构造函数有参数时使用 Moq 模拟对象

我有一个使用 moq 模拟的对象,对象的构造函数有必要的参数:

public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}

现在我尝试使用 moq 的 v3“ setup”或 v4“ Mock.Of”语法为这个对象创建模拟,但是不能解决这个问题... ... 我尝试的所有东西都没有验证。这是我目前为止得到的结果,但是最后一行给出的是一个实际的对象,而不是 mock。我这样做的原因是因为我要验证的 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);
129565 次浏览

最后一行是为您提供一个真实的实例,因为您使用的是 new 关键字,而不是模仿 CustomerSyncEngine。

你应该使用 Mock.Of<CustomerSyncEngine>()

模拟混凝土类型的唯一问题是,Moq 需要一个公共缺省构造函数(没有参数) ,或者你需要用构造函数 arg 规范创建 Moq。http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

The best thing to do would be right click on your class and choose Extract interface.

将最后一行更改为

var syncEngine = new Mock<CustomerSyncEngine>(mockLogger, mockCrm, mockCache).Object;

应该会有用的