我一直在使用RhinoAutoMocker进行单元测试,几乎在所有情况下都能很好地工作。我现在无法弄清楚当Class Under Test具有原始构造函数参数时如何使用它。
假设我有两个类定义如下:
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);
但使用构造函数参数的名称不会产生任何不同的结果。
--
从长远来看,这不是一个大问题,因为我总是可以创建一个Class Under Test的实例并创建我自己的模拟,能够在我的所有测试中使用一致的方法会很好。
我知道,这有点太晚了,但我有同样的问题,并设法用整数参数解决它:
var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
automocker.Container.Configure(c=>
c.For<RemoveAnswerValidator>()
.Use<RemoveAnswerValidator>()
.Ctor<int>()
.Is(1));
虽然我从未找到使用AutoMocker注入基元的方法,但我最终通过创建参数对象并注入它来解决问题。
除了其他(前)参数之外,参数对象还包括必要的基元作为属性。上面的例子将改为:
public class RemoveAnswerValidator : BaseValidator
{
public RemoveAnswerValidator(RemoveAnswerValidatorParameters parms)
{
...some code
}
public override bool Validates()
{
...some code
}
}
public class RemoveAnswerValidatorParameters
{
public int AnswerID { get; set; }
public IAnswerRepository AnswerRepository { get; set; }
}
(然后在测试课上)
[Test]
public void RemoveAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
var fakeAnswerParameters = new FakeAnswerParameters()
{
AnswerID = 1,
AnswerRepository = autoMocker.Get<IAnswerRepository>()
};
autoMocker.Inject<RemoveAnswerValidatorParameters>(fakeAnswer);
var result = autoMocker.ClassUnderTest.Validates();
Assert.IsTrue(result);
}