当构造函数有参数时用Moq嘲弄对象

我有一个对象,我试图用moq来模拟。 该对象的构造函数具有所需的参数:

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

现在我正在尝试使用moq的v3“setup”或v4“Mock.Of”语法来创build这个对象的模拟器,但无法弄清楚这一点…我正在尝试的一切都没有validation。 这是我迄今为止,但最后一行是给我一个真实的对象,而不是模拟。 我这样做的原因是因为我有CustomerSyncEngine我想validation被调用的方法…

 // 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); 

最后一行是给你一个真实的实例,因为你正在使用new关键字,而不是模拟CustomerSyncEngine。

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

Mocking Concretetypes的唯一问题是Moq需要一个公共的默认构造函数(没有参数),或者你需要用构造函数arg规范创buildMoq。 http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

最好的做法是右键点击你的课堂,然后select“提取界面”。

将最后一行更改为

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

它应该工作