让我们说,我有这个班级
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 - 如果输入不为null也不是0,则结果必须是该数字的绝对值。
我如何表达这些断言?
我可以写下这样的内容:
if(i.HasValue)
{
//Define the Assert statement inside a If, else constructions...
}
感谢您的帮助
答案 0 :(得分:4)
您需要创建三个测试而不是一个来测试三种不同的场景
如果输入为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));
如果输入不为null也不是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));
}
答案 1 :(得分:1)
不要在测试中使用if-else结构。如果您正在使用Nunit,请查看Parameterized tests - 您可以使用TestCaseAttribute
指定输入和输出。或者,为不同的输入创建单独的测试。
在编写单元测试(以及执行TDD)时,您可以遵循的另一个原则是测试名称中不应包含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等,语法和断言会有所不同,但原则保持不变。