为测试中的类创建AutoFixture中的匿名类型的目的是什么?

Spo*_*ock 7 unit-testing autofixture c#-4.0

我最近开始使用AutoFixture库(http://autofixture.codeplex.com/)进行单元测试,我非常喜欢它.

我从AutoFixture CodePlex网站获得了此代码示例.我的问题是关于8号线.

1.   [TestMethod]
2.   public void IntroductoryTest()
3.   {
4.        // Fixture setup
5.        Fixture fixture = new Fixture();
6.
7.        int expectedNumber = fixture.CreateAnonymous<int>();
8.        MyClass sut = fixture.CreateAnonymous<MyClass>();
9.        
10.        // Exercise system
11.        int result = sut.Echo(expectedNumber);
12.        
13.        // Verify outcome
14.        Assert.AreEqual<int>(expectedNumber, result, "Echo");
15.        // Teardown
16.    }
Run Code Online (Sandbox Code Playgroud)

我无法理解,为什么我们需要创建一个被测试类的匿名对象.

        MyClass sut = fixture.CreateAnonymous<MyClass>();
Run Code Online (Sandbox Code Playgroud)

该类应该是IMO的真实对象.举个例子..

        var sut = new MyClass();    
Run Code Online (Sandbox Code Playgroud)

我的问题是,创建一个匿名对象进行测试的真正好处是什么?

Rub*_*ink 5

在微不足道的情况下,你是对的 - 没有实质性的区别。

然而,SUT API Encapsulation有它的用途——因为你的 System Under Test 和它的Fixture Object s 比使用默认 ctor 的东西更有趣(它真的没有依赖关系吗?),例如:

  • MyClass 需要将东西输入到它的构造函数中
  • `MyClass 具有您不希望应用默认值的读/写属性(巧合编程)
  • 建筑MyClass还有其他任何你想应用政策的东西

然后让Sut Factory参与进来的力量开始发挥作用,让无关代码消失,并允许您将横切关注点应用于流程。

编辑:出于某种原因,@Brad Wilson 认为适合重新发布这篇有点突出的文章

  • +1 基本上,它将单元测试与 SUT 的构造函数签名分离,从而使测试在面对重构时更加健壮。 (7认同)