【问题标题】:How can I inject primitive values using RhinoAutoMocker?如何使用 RhinoAutoMocker 注入原始值?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-26
        • 1970-01-01
        • 2016-07-25
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2018-09-26
        相关资源
        最近更新 更多