【发布时间】:2014-01-07 17:16:29
【问题描述】:
我一直在使用 RhinoAutoMocker 进行单元测试,它几乎在所有情况下都运行良好。我目前无法弄清楚当被测类具有原始构造函数参数时如何使用它。
假设我有两个这样定义的类:
public class AddAnswerValidator : BaseValidator
{
public AddAnswerValidator(Answer answerToAdd,
IAnswerRepository answerRepository)
{
...some code
}
public override bool Validates()
{
...some code
}
}
public class RemoveAnswerValidator : BaseValidator
{
public RemoveAnswerValidator(int answerIDToRemove,
IAnswerRepository answerRepository)
{
...some code
}
public override bool Validates()
{
...some code
}
}
每个测试的示例如下:
[Test]
public void AddAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
var autoMocker = new RhinoAutoMocker<AddAnswerValidator>();
var fakeAnswer = new Answer();
autoMocker.Inject<Answer>(fakeAnswer);
var result = autoMocker.ClassUnderTest.Validates();
Assert.IsTrue(result);
}
[Test]
public void RemoveAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
var fakeAnswerID = 1;
autoMocker.Inject<int>(fakeAnswerID);
var result = autoMocker.ClassUnderTest.Validates();
Assert.IsTrue(result);
}
第一个测试(针对 AddAnswerValidator)运行良好。第二个测试(针对 RemoveAnswerValidator)失败,出现 StructureMap 202 错误“没有为插件系列 RemoveAnswerValidator 定义默认实例”错误。我假设第二个测试失败,因为 StructureMap 没有解析整数构造函数参数。
我已经阅读了this post regarding RhinoAutoMocker Injection for collections,并且一直在跟踪source code on GitHub,但我不明白为什么没有注入原始值。
我什至尝试替换容器对象上可用的一些重载 Inject 方法,例如:
autoMocker.Inject<int>(fakeAnswerID);
与
autoMocker.Container.Inject<int>("answerIDToRemove", fakeAnswerID);
但使用构造函数参数的名称不会产生任何不同的结果。
--
从长远来看,这不是一个大问题,因为我总是可以创建一个被测类的实例并创建我自己的模拟,如果能够在所有测试中使用一致的方法就好了我的测试。
【问题讨论】:
标签: c# dependency-injection structuremap rhino-mocks