在单元测试时,我在哪里放置公共代码?

时间:2018-01-23 09:42:40

标签: c# unit-testing nunit

请参阅以下代码:

Guid product1Guid = Guid.NewGuid();
Guid product2Guid = Guid.NewGuid();
Products = new List<Product>();
var product1 = new Product(product1Guid), "Product 1");
var product2 = new Product(product1Guid), "Product 2");
Products.Add(product1);
Products.Add(product2);

我的五种测试方法使用此代码。我在哪里放这个代码?选项包括:

1)OneTimeSetup方法:另一个问题的回答者提出反对意见,因为产品是可变的,并且将来一次测试可能会意外地改变状态,这意味着以下所有测试都会失败。

2)在测试类中创建一个方法 (返回列表):另一个问题的回答者提出建议,因为你不应该存根一个简单的数据对象。

3)将上面的代码放在每个测试方法中。这似乎违反了DRY原则。

4)创建一个Helper类,在测试类的外部(返回列表):我不确定这是否正常。

我意识到上面的所有选项都可行。我试图遵循这里最不惊讶的原则,以便将来查看我的代码的开发人员将知道会发生什么。

1 个答案:

答案 0 :(得分:2)

NUnit SetUp属性解决了这个问题。

  

此属性在TestFixture中用于提供一组通用的   在调用每个测试方法之前执行的函数。

[TestFixture]
public class ExampleTest
{
    Guid product1Guid;
    Guid product2Guid;
    List<Product> Products;

    [SetUp]
    public void PerTestPrepare()
    {
        product1Guid = Guid.NewGuid();
        product2Guid = Guid.NewGuid();
        Products = new List<Product>();
        var product1 = new Product(product1Guid), "Product 1");
        var product2 = new Product(product1Guid), "Product 2");
        Products.Add(product1);
        Products.Add(product2);
    }

    [Test]
    public void SimpleCheck_Containts_True()
    {
        Assert.IsTrue(Products.Any(p => p.Id == product1Guid));
    }
}