【问题标题】:AutoMoqer: Passing parameters into constructorsAutoMoqer:将参数传递给构造函数
【发布时间】:2011-12-06 20:44:50
【问题描述】:

当我需要模拟一些像这样的类时:

public class Dummy
{
  private readonly int _someInt;
  private readonly int _someOtherInt;
  private readonly IFoo _foo;

    public Dummy(int someInt,int someOtherInt, IFoo foo)
    {
      _someInt = someInt;
      _someOtherInt = someOtherInt;
      _foo = foo;
    }
}

我使用最小起订量来做这样的事情:

[Test]
public void ShouldCreateADummyInstance()
{
      var someInt = 1;
      var someOtherInt = 2;

      var mockFoo = new Mock<IFoo>();

      var dummy = new Dummy(someInt, someOtherInt, mockFoo.Object);

      //And so on...
}

但是当我使用AutoMoq 时,我无法在我的构造函数中为每个依赖项(我的意思是 someInt 和 someOtherInt)指定不同的 int,因为 AutoMoqer.SetInstace(instanceIWantToUse) 每次必须提供相同的指定实例依赖。

您知道如何为 someInt 和 someOtherInt 指定不同的 int 以便在我的测试中继续使用 AutoMoqer 吗?

谢谢,希望你能帮帮我!

【问题讨论】:

    标签: c# unit-testing c#-4.0 mocking moq


    【解决方案1】:

    完全披露:我从未使用过 AutoMoq(尽管我只是在 GitHub 上注册关注它,因为它看起来很有趣,而且我喜欢减少样板文件的东西)。

    也就是说,AutoMoq 工具似乎是为与您的不同用例而设计的。如果添加了另一个构造函数注入的依赖项,他似乎使用它来“未来证明”以防止单元测试损坏,并且能够为依赖项生成一个带有某些东西的默认对象,大概是为了避免空引用异常。

    我会在阅读 AutoMoq 项目页面后假设,如果 Darren 正在编写您的特定单元测试,他可能会直接使用 Moq。也就是说,对于那个特定的测试,您可能应该使用您发布的测试。当您不想在测试中指定所有依赖项时,AutoMoq 似乎旨在提供合理的默认行为。但是在您的情况下,您确实想要指定那些特定的依赖项。

    仅仅因为您将常规 Moq 用于特定测试并不意味着您不能将 AutoMoq 用于其他测试。您的其余测试(两个整数都为零或其他)将是面向未来的,但如果您向 Dummy 类添加另一个构造函数参数,您可能只需要忍受那个中断。

    (您也可以随时获取 AutoMoq 的源代码并根据需要对其进行修改)。

    【讨论】:

    • 我认为你是对的,但我有一组从基本抽象类派生的类,这些类具有像这样的依赖关系的构造函数。我看到我能够创建 AutoMoqer 将使用的 Unity 容器,所以我想知道是否可以指定将对象值注入以某种方式命名的依赖项。我的意思是,当我有一个名为“myInt”的依赖项注入 3 时,例如,每个名为“myInt”的依赖项都将提供一个 3。
    【解决方案2】:

    类似起订量的解决方案

    您可以在 AutoMoq 中创建一个 Dummy 实例,这与在 Moq 中所做的非常相似。 这不会在未来证明您的测试代码不会改变构造函数参数,但仍然可以接受。

    var mocker = new AutoMoqer();
    var fooMock = mocker.GetMock<IFoo>();
    var dummy = new Dummy(1, 2, fooMock.Object);
    // test something about dummy
    

    AutoMoq 解决方案

    如果您真的想在未来证明您的 TestCode,那么可能需要将构造函数更改为依赖于接口。

    interface IDummyParameters {
        int SomeInt {get;set;}
        int SomeOtherInt {get;set;}
    }
    
    public class Dummy {
        public Dummy(IDummyParameters parameters, IFoo foo){
            ...
        }
    }
    

    然后您可以像这样使用 AutoMoq 创建您的 Dummy 类:

    var mocker = new AutoMoqer();
    mocker.GetMock<IDummyParameters>.Setup(x => x.SomeInt).Returns(1);
    mocker.GetMock<IDummyParameters>.Setup(x => x.SomeOtherInt).Returns(2);
    // notice how this code does not say anything about IFoo.
    // It is created automatically by AutoMoq
    var dummy = mocker.Create<Dummy>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2015-10-11
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多