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

问题描述 投票:0回答:3

我有一个对象,我正在尝试使用最小起订量来模拟。对象的构造函数具有必需的参数:

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);
moq
3个回答
114
投票

将最后一行更改为

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

它应该可以工作


40
投票

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

你应该使用

Mock.Of<CustomerSyncEngine>()

模拟具体类型的唯一问题是 Moq 需要一个公共默认构造函数(不带参数),或者您需要使用构造函数参数规范创建 Moq。

最好的办法是右键单击您的类并选择提取接口。


0
投票

应该是:

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

您应该将被模拟的对象传递给构造函数,而不是模拟本身。 TLDR; 在模拟上使用 Object 属性。

© www.soinside.com 2019 - 2024. All rights reserved.