Oma*_*mar 2 c# unit-testing mocking
给这个班:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我是否应断言_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());
}
Run Code Online (Sandbox Code Playgroud)
我建议你断言_service.AnotherMethod(input)
一次.如果没有调用该服务,那么只会使一个测试失败,并且您将知道问题的根源.否则,您将遇到一堆失败的测试,您将不得不搜索失败的来源.
在一个完美的世界中,你应该通过单个断言进行多次测试,只给出每个测试失败的一个理由.
归档时间: |
|
查看次数: |
86 次 |
最近记录: |