给这个班:
public class ClassToTest
{
private IService _service;
public ClassToTest(IService service)
{
_service = service;
}
public Output MethodToTest(string input)
{
if (string.IsNullOrEmpty(input))
throw new ArgumentNullException("input");
var output = new Output();
if (input == "Yes")
output.Value = "X";
else
output.Value = "Y";
_service.AnotherMethod(input);
return output;
}
}
我是否应断言在此方法的每个单元测试中调用_service.AnotherMethod(input)
,如下所示,或者只是在一种方法中测试它?
// Test #1
[Test]
public void ThrowsExceptionForEmptyInput()
{
// Arrange
var service = new Mock<IService>();
var classToTest = new ClassToTest(service.Object);
// Act
var result = () => classToTest.MethodToTest("");
// Assert
result.ShouldThrow<ArgumentNullException>();
}
// Test #2
[Test]
public void ReturnsXForYesAndCallsAnotherMethod()
{
// Arrange
string input = "Yes";
var service = new Mock<IService>();
var classToTest = new ClassToTest(service.Object);
// Act
var result = classToTest.MethodToTest(input);
// Assert
Assert.Equals("X", result.Value);
service.Verify(m => m.AnotherMethod(input), Times.Once());
}
// Test #3
[Test]
public void ReturnsYForAnyValueAndCallsAnotherMethod()
{
// Arrange
string input = "Other Value Not Yes";
var service = new Mock<IService>();
var classToTest = new ClassToTest(service.Object);
// Act
var result = classToTest.MethodToTest(input);
// Assert
Assert.Equals("X", result.Value);
service.Verify(m => m.AnotherMethod(input), Times.Once());
}
答案 0 :(得分:5)
我建议你只断言_service.AnotherMethod(input)
一次。如果没有调用该服务,那么只会使一个测试失败,并且您将知道问题的根源。否则你将有一堆失败的测试,你将不得不搜索失败的来源。
在一个完美的世界中,你应该通过单个断言进行多次测试,只给出每个测试失败的一个理由。