Все тестовые случаи Moq проходят без проверки какой-либо логики?

Я слежу за этим вступлением к учебнику по модульному тестированию.

Я не реализовал логику, чтобы определить, какой кредитный рейтинг должен возвращать "Возможно", "Отклонено", но тест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 Мок тест прошел! Не могли бы вы объяснить, что не так с этими кодами.

1 ответ

Решение

Насколько я могу судить, ваш код работает точно так, как задумано / написано. Вы создаете издевательство ICreditDecisionService и сказать, что нужно возвращать в каждом случае. Тест с другой стороны утверждает, что происходят две вещи:

  1. CreditDecision.MakeCreditDecision() возвращает значение, сгенерированное ICreditDecisionService (в этом случае издевается, чтобы всегда возвращать правильное / известное значение).

  2. призвание CreditDecision.MakeCreditDecision() звонки ICreditDecisionService.GetCreditDecision() с правильным значением creditScore,

Поэтому ваш тест тестирует CreditDecision не ICreditDecisionService, Вам не нужна реализация ICreditDecisionService тестировать CreditDecision; это где насмешка. Вы изолируете CreditDecision от ICreditDecisionServiceкакой бы ни была реальная реализация, чтобы проверить только CreditDecision,

Однако я бы изменил название теста, чтобы отразить, что на самом деле происходит в тесте; возможно что-то вроде MakeCreditDecision_Returns_Result_From_Service было бы лучшим описанием.

Другие вопросы по тегам