【问题标题】:All Moq testCases pass without checking any logic?所有 Moq 测试用例都通过而不检查任何逻辑?
【发布时间】:2017-10-31 01:02:10
【问题描述】:

我正在关注这个intro to unit testing 教程。

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

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,但Moq测试通过了!你能解释一下这些代码有什么问题吗?

【问题讨论】:

  • 您的代码似乎没有任何问题。它正在执行,就像您将其配置为运行一样。您不需要实现,这就是您使用模拟的原因。被测类CreditDecision 被注入一个模拟依赖项来测试MakeCreditDecision 方法。
  • 这似乎是XY problem。您要达到的最终目标是什么?
  • 我试图理解为什么我们不需要if(creditScore) then return "Mabye" ..... 。除了了解起订量之外,不要试图实现任何目标。

标签: c# unit-testing moq moq-3


【解决方案1】:

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

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

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

因此,您的测试是在测试 CreditDecision 不是 ICreditDecisionService。你不需要实现ICreditDecisionService 来测试CreditDecision;这就是模拟的用武之地。无论实际实现是什么,您都将CreditDecisionICreditDecisionService 隔离开来,以便仅测试CreditDecision

不过,我会更改测试名称以反映测试中实际发生的情况;也许像MakeCreditDecision_Returns_Result_From_Service 这样的描述会更好。

【讨论】:

  • 我们不测试ICreditDecisionService。这是有道理的。谢谢!
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2021-06-16
相关资源
最近更新 更多