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

时间:2011-10-20 00:47:08

标签: c# tdd

让我们说,我有这个班级

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

感谢您的帮助

2 个答案:

答案 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等,语法和断言会有所不同,但原则保持不变。