2015-04-23 57 views
0

在对某个类进行单元测试时,需要针对类中的不同数据组合测试相同的方法。这可以通过编写几个TextFixture并重复每个测试方法来实现,如下所示。在nUnit中构造TextFixtures

[TextFixture] 
public class WhenBuildingLongFoo 
{ 
    private Foo foo; 

    [Setup] 
    public void Creating() 
    { 
      foo = new Foo(){Height = new FooHeight(200)}; 
    } 

    [Test] 
    public void ReturnsValidHeight() 
    { 
    Assert.AreEqual(200, foo.Height); 
    } 
    } 

    [TextFixture] 
    public class WhenBuildingShortFoo 
    { 
    private Foo foo; 
    [SetUp] 
    public void Creating() 
    { 
     foo = new Foo(){Height=newFooHeight(2); 
    } 
    [Test] 
    public void ReturnsValidHeight() 
    { 
     Assert.AreEqual(2, foo.Height); 
    } 
} 
  1. 是什么结构,灯具的最佳途径,使法ReturnsValidHeight仅被写入一次?

我想出了在公共命名空间中创建一个公共的静态类实用程序,它具有此方法;但可以请你提供更好的建议吗?

就像用这样的方法创建一个抽象类,然后从它派生装置?

  1. 如何在灯具中重新使用设置,只是变化的值?

回答

4

使用TestCase属性可以使用不同的输入值运行相同的测试。这会减少很多重复的代码。在你的情况下,SetUp方法也不是必需的。

[TextFixture] 
public class FooTests 
{ 
    [Test] 
    [TestCase(200)] 
    [TestCase(2)] 
    public void ReturnsValidHeight(int expectedHeight) 
    { 
     var foo = new Foo { Height = new FooHeight(expectedHeight) }; 

     Assert.AreEqual(expectedHeight, foo.Height); 
    } 
} 
+0

我同意。 [SetUp]属性有其缺点。例如,它在物理上分隔了一部分测试代码。将每个测试都视为“微小的宇宙本身”,而不必扫描可能的SetUp方法是一种很好的尝试。您可以经常使用对Builder的测试方法调用或类似的东西替代SetUp方法,这样可以提供更多的灵活性(即每个测试都需要_exactly_相同的SetUp?)。 – prgmtc