AutoMoqer:如何将参数传递给构造函数

4
当我需要模拟以下类的时候:
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;
    }
}

我使用Moq来做类似这样的事情:
[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.SetInstance(instanceIWantToUse)每次设置相同的指定实例,该实例必须提供该依赖项。

你知道如何指定一些int以保持在我的测试中继续使用AutoMoqer吗?

谢谢,希望你能帮助我!

2个回答

2
免责声明:我从未使用过AutoMoq(尽管我刚在GitHub上注册了一下来关注它,因为它看起来很有趣,并且我喜欢可以减少样板代码的东西)。
话虽如此,它似乎是为不同的用例而设计的。看起来他使用它来“未雨绸缪”,以防万一向另一个构造函数注入依赖关系,并能够生成一个默认对象,其中包含依赖项中的某些内容,可能是为了避免空引用异常。
阅读了AutoMoq项目页面后,我认为如果Darren正在编写你特定的单元测试,他可能会直接使用Moq。也就是说,在这种情况下,你应该选择你发布的那个测试。AutoMoq似乎旨在为当你不想在测试中指定所有依赖项时提供合理的默认行为。但在你的情况下,你确实想指定那些特定的依赖关系。
仅仅因为你在这个特定的测试中使用了普通的Moq,并不意味着你不能在其他测试中使用AutoMoq。你其余的测试(其中两个int都是零或者其他任何值)将被未雨绸缪,但如果你将另一个构造函数参数添加到Dummy类中,则必须接受其中一个测试会失败的可能性。
(你也可以随时获取AutoMoq的源代码并根据自己的需求进行修改。)

我认为你是正确的,但我有一组从一个基础抽象类派生的类,这些类具有像这样的依赖项构造函数。我看到我能够创建AutoMoqer将使用的Unity容器,所以我想知道是否可以指定要注入对象值到特定命名的依赖项。我的意思是,当我有一个名为"myInt"的依赖关系时,注入3,因此每个名为"myInt"的依赖关系都将提供一个3,例如。 - Pato

1

类似于Moq的解决方案

您可以在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解决方案

如果你真的想要让你的测试代码具备未来性,那么可能需要改变构造函数以依赖于接口。

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>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接