模拟对象通过AutoFixture注入AutoMoq,意外行为

时间:2012-09-17 13:09:22

标签: moq autofixture

我刚刚使用AutoFixture创建了我的第一个测试。 SUT具有以下构造函数。

public LoggingService(
    IClientDataProvider clientDataProvider, ... other dependencies...)

测试设置包含以下代码。

var fixture = new Fixture().Customize(new AutoMoqCustomization());

string ipAddress = "whatever";// fixture.CreateAnonymous<string>();

var clientDataProviderMock = fixture.Freeze<Mock<IClientDataProvider>>();
clientDataProviderMock.Setup(cdp => cdp.IpAddress).Returns(ipAddress);

LoggingService sut = fixture.CreateAnonymous<LoggingService>();

现在,当我检查sut的内容时,我看到注入的IpAddress实例的属性IClientDataProvider返回null而不是“what”。

我做错了什么?


我将服务和必要的接口复制到一个空项目中,然后模拟按预期工作。

作为真实项目中服务的构造函数参数类型的接口在3个具有进一步依赖性的独立程序集中定义。我在测试开始时遇到了几个意外的“无法加载程序集”错误,因为这些直接引用的程序集需要几个其他程序集。所以它似乎是一个装配加载问题。

然而,我尝试使用手动创建SUT实例的测试变体,使用Moq手动创建模拟对象,测试按预期工作

1 个答案:

答案 0 :(得分:1)

解决方案非常令人惊讶。当我创建单元测试项目时,我首先添加了对Moq 4.0的引用。 AutoFixture后来添加,因为它似乎需要Moq 3.1,我将该DLL直接复制到bin \ Debug。但是,项目文件中相应的HintPath元素仍然指向4.0 dll。一旦我将HintPath更改为指向Moq 3.1所在的位置,测试就开始正常工作。所以Mark对他的建议是正确的,但症状完全不同。