在测试中断言变量集合

Assert collection of variables in test

我正在尝试编写一个 C# 测试方法来测试每个员工的税收计算。我的 _recordsList<PayRecord>.

是否可以将我所有的变量放入一个列表中,并根据 actualTax 列表检查每个值?

public void TestTax()
{
    PayRecord empOne = _records[0];
    double actualTaxOne = empOne.Gross;
    PayRecord empTwo = _records[1];
    double actualTaxTwo = empTwo.Gross;
    PayRecord empThree = _records[2];
    double actualTaxThree = empThree.Gross;
    PayRecord empFour = _records[3];
    double actualTaxFour = empFour.Gross;
    PayRecord empFive = _records[4];
    double actualTaxFive = empFive.Gross;

    double expectedTax_empOne = 652;
    double expectedTax_empTwo = 418;
    double expectedTax_empThree = 2202;
    double expectedTax_empFour = 1104;
    double expectedTax_empFive = 1797.45;

    Assert.AreEqual(expectedTax_empOne, actualTaxOne);
    Assert.AreEqual(expectedTax_empTwo, actualTaxTwo);
    Assert.AreEqual(expectedTax_empThree, actualTaxThree);
    Assert.AreEqual(expectedTax_empFour, actualTaxFour);
    Assert.AreEqual(expectedTax_empFive, actualTaxFive);
}

你的意思是……

    public void TestTax()
    {
        var expect = new double[] { 652, 418, 2202, 1104, 1797.45 };

        for(int x = 0; x < expect.Length; x++){
            Assert.AreEqual(expect[x], _records[x].Gross);
        }
    }

?

更短的代码,尤其是可能的最短代码,并不总是更好。请记住,您为未来的您或您的同事编写代码;执行它的机器不在乎它有多短(除非你想挤出最后一点性能,然后仍然)。

你希望你的断言是明确和清晰的,这样未来你仍然理解那里发生了什么以及为什么。甚至可以为每一个添加您期望该值的原因的评论。

不清楚您的测试实际在做什么,或者为什么您需要在一次测试中为五名不同的员工测试相同的计算,但您显示的代码可以简化为:

// These employees are in tax bracket 1
Assert.AreEqual(652, _records[0].Gross);
Assert.AreEqual(418, _records[1].Gross);

// These two are in the middle
Assert.AreEqual(1104, _records[3].Gross);
Assert.AreEqual(1797.45, _records[4].Gross);

// Look at mister big earner here
Assert.AreEqual(2202, _records[2].Gross);

不需要所有这些中间变量,断言中有实际值也没有问题。

使用Linq和NUnit ist可以这样写:

public void TestTax()
{
    // NUnit Constraint Assertion Model
    Assert.That(_records.Select(x => x.Gross), Is.EqualTo(new double[] { 652, 418, 2202, 1104, 1797.45 }));

    // NUnit Classic Assertion Model
    Assert.AreEqual(_records.Select(x => x.Gross), new double[] { 652, 418, 2202, 1104, 1797.45 });
}

对于失败的断言,NUnit 会提供如下详细消息:

NUnit.Framework.AssertionException:   Expected is <System.Double[5]>, actual is <System.Linq.Enumerable+WhereSelectListIterator`2[SimControl.Samples.CSharp.ClassLibrary.Tests.SampleClassTests+PayRecord,System.Double]>
  Values differ at index [1]
  Expected: 418.0d
  But was:  1.0d