2014-01-07 50 views
1

我一直在使用RhinoAutoMocker进行单元测试,并且几乎在所有情况下都能很好地工作。我目前无法弄清楚当被测试类有简单的构造函数参数时如何使用它。如何使用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,但我不明白为什么原始值没有被注入。

我甚至尝试了一些替代的重载进样方法可用容器对象如:

autoMocker.Inject<int>(fakeAnswerID); 

autoMocker.Container.Inject<int>("answerIDToRemove", fakeAnswerID); 

但是使用这个名字的构造函数参数不产生任何不同的结果。

-

从长远来看,这是不是一个巨大的问题,因为我永远可以创建类的实例在测试和创建自己的嘲弄,这纯粹是高兴能够在我的所有测试中使用一致的方法。

回答

0

我知道,这是一个有点太晚了,但我有同样的问题,并设法解决它带整数参数:

var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>(); 
automocker.Container.Configure(c=> 
     c.For<RemoveAnswerValidator>() 
      .Use<RemoveAnswerValidator>() 
       .Ctor<int>() 
       .Is(1)); 
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); 
}