【发布时间】:2012-09-17 13:09:21
【问题描述】:
我刚刚使用 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 的内容时,我看到IClientDataProvider 的注入实例的属性IpAddress 返回null 而不是“whatever”。
我做错了什么?
我将服务和必要的接口复制到一个空项目中,然后模拟按预期工作。
作为实际项目中服务的构造函数参数类型的接口在 3 个具有进一步依赖关系的单独程序集中定义。我在测试开始时遇到了几个意外的“无法加载程序集”错误,因为那些直接引用的程序集还需要几个进一步的程序集。所以这似乎是一个程序集加载问题。
但是,我尝试了一种测试变体,手动创建 SUT 实例,使用 Moq 手动创建模拟对象,测试按预期工作
【问题讨论】:
-
您的代码看起来不错,但我无法重现您的问题。对我来说,IpAddress 包含“whatever”......你可以在一个空项目中尝试它吗?
AuditHistoryLoggingService是什么? -
AuditHistoryLoggingService - 读作 LoggingService,我只是试图从原始代码中删除“过多的字符”。
-
IpAddress 属性(
String类型)具有正确的值。我在 LogginService 类构造函数中添加了一个断点并检查了IClientDataProvider实例。您可以复制粘贴您的LoggingService课程吗? -
既然您似乎遇到了程序集加载问题,可能是这个问题吗? stackoverflow.com/questions/6505591/autofixture-and-moq-v4
-
马克,感谢您的建议,但情况有所不同。正如我所写,依赖项的模拟实例已创建并注入到服务中,但它们不是我使用 Freeze 设置的。
标签: moq autofixture