Все тестовые случаи 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
и сказать, что нужно возвращать в каждом случае. Тест с другой стороны утверждает, что происходят две вещи:
CreditDecision.MakeCreditDecision()
возвращает значение, сгенерированноеICreditDecisionService
(в этом случае издевается, чтобы всегда возвращать правильное / известное значение).призвание
CreditDecision.MakeCreditDecision()
звонкиICreditDecisionService.GetCreditDecision()
с правильным значениемcreditScore
,
Поэтому ваш тест тестирует CreditDecision
не ICreditDecisionService
, Вам не нужна реализация ICreditDecisionService
тестировать CreditDecision
; это где насмешка. Вы изолируете CreditDecision
от ICreditDecisionService
какой бы ни была реальная реализация, чтобы проверить только CreditDecision
,
Однако я бы изменил название теста, чтобы отразить, что на самом деле происходит в тесте; возможно что-то вроде MakeCreditDecision_Returns_Result_From_Service
было бы лучшим описанием.