如何使用RhinoAutoMocker注入原始值?

时间:2014-01-07 17:16:29

标签: c# dependency-injection structuremap rhino-mocks

我一直在使用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错误&#34;没有为插件系列RemoveAnswerValidator定义默认实例&#34;错误。我假设第二个测试失败是因为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的实例并创建我自己的模拟,所以能够在所有模型中使用一致的方法会很好我的测试。

2 个答案:

答案 0 :(得分:0)

虽然我从来没有找到使用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);
}

答案 1 :(得分:0)

我知道,这有点太晚了,但我遇到了同样的问题并设法用整数参数来解决它:

var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
automocker.Container.Configure(c=>
         c.For<RemoveAnswerValidator>()
           .Use<RemoveAnswerValidator>()
                .Ctor<int>()
                .Is(1));