在测试中断言变量集合
Assert collection of variables in test
我正在尝试编写一个 C# 测试方法来测试每个员工的税收计算。我的 _records
是 List<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
我正在尝试编写一个 C# 测试方法来测试每个员工的税收计算。我的 _records
是 List<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