2012-09-17 33 views
1

我刚刚使用AutoFixture创建了我的第一个测试。 SUT具有以下构造函数。通过AutoFixture注入模拟对象与AutoMoq,意外的行为

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内容,我看到的IClientDataProvider回报注入实例的属性IpAddress空,而不是“无所谓”。

我做错了什么?


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

作为实际项目中服务的构造函数参数类型的接口在3个独立的程序集中定义,这些程序集有更多的依赖关系。我在测试启动时出现了一些意想不到的“无法加载程序集”错误,因为这些直接引用的程序集需要多个进一步的程序集。所以它似乎是一个程序集加载问题。

不过,我想测试的变化与手动创建使用起订量手动创建模拟对象的SUT实例和测试工作如预期

+0

你的代码看起来很好,我无法重现你的问题。对我来说,IpAddress包含“无论”......你可以在一个空的项目中尝试它吗?什么是AuditHistoryLoggingService? – nemesv

+0

AuditHistoryLoggingService - 作为LoggingService读取,我试图从原始代码中删除“过多的字符”。 –

+0

IpAddress属性('String'类型)具有正确的值。我在LogginService类构造函数中添加了一个断点,并检查了'IClientDataProvider'实例。你可以复制粘贴你的'LoggingService'类吗? –

回答

1

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