我是否应断言在给定方法的每个单元测试中都会调用依赖关系的方法?

时间:2013-11-25 22:41:21

标签: 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;
    }
}

我是否应断言在此方法的每个单元测试中调用_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());
}

1 个答案:

答案 0 :(得分:5)

我建议你只断言_service.AnotherMethod(input)一次。如果没有调用该服务,那么只会使一个测试失败,并且您将知道问题的根源。否则你将有一堆失败的测试,你将不得不搜索失败的来源。

在一个完美的世界中,你应该通过单个断言进行多次测试,只给出每个测试失败的一个理由。