0

我正在关注单元测试教程的介绍。

我还没有实现逻辑来确定应该返回“可能”、“拒绝”的信用评分,但最小起订量测试通过了所有单元测试。

public interface ICreditDecisionService {
    string GetCreditDecision(int creditScore);
}

public class CreditDecision {
ICreditDecisionService creditDecisionService;

public CreditDecision(ICreditDecisionService creditDecisionService) {
    this.creditDecisionService = creditDecisionService;
}

public string MakeCreditDecision(int creditScore) {
    return creditDecisionService.GetCreditDecision(creditScore);
}

===================================
// Testing Class
[TestFixture]
public class CreditDecisionTests {
    //mock instance for dependency
    Mock < ICreditDecisionService > mockCreditDecisionService;

    CreditDecision systemUnderTest;

    [TestCase(100, "Declined")]
    [TestCase(549, "Declined")]
    [TestCase(550, "Maybe")]
    [TestCase(674, "Maybe")]
    [TestCase(675, "We look forward to doing business with you!")]
    public void MakeCreditDecision_Always_ReturnsExpectedResult(int creditScore, string expectedResult) {

        //Arrange
        //creating and configuring the mock 
        mockCreditDecisionService = new Mock < ICreditDecisionService > (MockBehavior.Strict);
        mockCreditDecisionService.Setup(p => p.GetCreditDecision(creditScore)).Returns(expectedResult);

        systemUnderTest = new CreditDecision(mockCreditDecisionService.Object);
        var result = systemUnderTest.MakeCreditDecision(creditScore);

        Assert.That(result, Is.EqualTo(expectedResult));

        mockCreditDecisionService.VerifyAll();
    }
}

我没有实现ICreditDecisionService,但起量测试通过了!你能解释一下这些代码有什么问题吗?

4

1 回答 1

1

据我所知,您的代码完全按照设计/编写的方式工作。您正在创建一个模拟ICreditDecisionService并告诉它在每种情况下要返回什么。另一方面,测试断言发生了两件事:

  1. CreditDecision.MakeCreditDecision()返回由 生成的值ICreditDecisionService(在这种情况下模拟为始终返回正确/已知的值)。

  2. 调用具有正确值的CreditDecision.MakeCreditDecision()调用。ICreditDecisionService.GetCreditDecision()creditScore

因此,您的测试CreditDecision 不是 ICreditDecisionService测试。你不需要一个实现ICreditDecisionService来测试CreditDecision;这就是模拟的用武之地。无论实际实现可能是什么,您都与 隔离,以便仅进行CreditDecision测试。ICreditDecisionServiceCreditDecision

但是,我会更改测试名称以反映测试中实际发生的情况;也许类似的东西MakeCreditDecision_Returns_Result_From_Service会是一个更好的描述。

于 2017-10-31T01:11:59.827 回答