TDD:当一个方法根据输入返回不同的结果时,如何测试结果
本文关键字:返回 结果 测试结果 输入 方法 一个 TDD | 更新日期: 2023-09-27 18:11:40
比方说,我有一个class
public class MyClass
{
public int MyMethod(int? i)
{
throw new NotImplementedException();
}
}
我也有一个测试类
[TestClass]
public class MyClassTest
{
Public void Retur_Int_Greater_Than_Zero_When_Input_Is_Not_Null_And_Zero_Otherwise()
{
// Arrange
var myVar = new MyClass();
int? i = 3;
// Act
var result = myVar.MyMethod(i)
//Assert
//
}
}
我想检查-如果输入是空或0,结果必须是0 -如果输入不是空或0,结果必须是那个数字的绝对值。
我如何表达这些断言?
我可以这样写吗:
if(i.HasValue)
{
//Define the Assert statement inside a If, else constructions...
}
谢谢你的帮助
您需要创建三个而不是一个测试来测试三个不同的场景
如果输入为null或0,结果必须为0
// Act
var result = myVar.MyMethod(null)
//Assert
Assert.That(result, Is.EqualTo(0));
// Act
var result = myVar.MyMethod(0)
//Assert
Assert.That(result, Is.EqualTo(0));
如果输入不为空或0,则结果必须为该数字的绝对值。
// Act
int graterThatZero = 1;
int absoluteValue = //define it here;
var result = myVar.MyMethod(graterThatZero)
//Assert
Assert.That(result, Is.EqualTo(absoluteValue));
同样使用NUnit
中的TestCase属性[TestCase(null,0)]
[TestCase(0,0)]
[TestCase(1, 1 /* absolute value */)]
[TestCase(-1, 1)]
public void MyMethod_should_return_absolute_value(int? argument, int expectedResult)
{
// Arrange
var myVar = new MyClass();
// Act
var result = myVar.MyMethod(argument)
// Assert
Assert.That(result, Is.EqualTo(expectedResult));
}
不要在测试中使用if-else结构。如果您正在使用Nunit,请查看参数化测试—您可以使用TestCaseAttribute
来指定输入和输出。或者,为不同的输入创建单独的测试。
and
。这意味着你在测试两件事。从您试图给出的测试名称中,您可以看到您需要拆分测试。
样本测试:[TestCase(null,0)]
[TestCase(0,0)]
[TestCase(10,10)]
[TestCase(-10,10)]
public void TestItWorksForInput(int? input, int expectedOutput)
{
var myVar = new MyClass();
var output = myVar.MyMethod(argument);
Assert.That(output, Is.EqualTo(expectedOutput));
}
还要注意,您必须测试边界条件,并确保您对每个边界条件都进行了测试。在上面的代码中,虽然只编写了一个测试,但当它运行时,它运行为4,您甚至可以看到其中一个或多个测试是否以及何时失败。
同样,测试样本是针对Nunit的。如果使用MSTest、Xunit、Mbunit等,语法和断言会有所不同,但原则是相同的。