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...
}

谢谢你的帮助

TDD:当一个方法根据输入返回不同的结果时,如何测试结果

您需要创建三个而不是一个测试来测试三个不同的场景

如果输入为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来指定输入和输出。或者,为不同的输入创建单独的测试。

在编写单元测试(和执行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等,语法和断言会有所不同,但原则是相同的。