2016-10-20 2 views
0

Я новичок в насмешливости. У меня есть интеграционный тест, который я хочу изменить на модульный тест. Я знаю, что я должен mock balancePositiveCalculator, так как он сотрудничает с classUnderTest, но я не уверен, как насмехаться здесь, поэтому я только тестирую classUnderTest. Должен ли я создавать mock balancePositiveCalculator и параметры настройки и законченный возврат, а затем использовать метод mock object для расчета затрат. FeesAndInterest? Я использую moq.Как я могу сделать это тестовое тестирование интеграции с насмешкой?

[TestMethod] 
public void Calculate_VirtualSaving_PositiveSaving() 
{ 
    var balance = 100M; 
    var monthlyRepayment = 20M; 
    var currentInterestRate = 18.9M; 
    var savingsExpected = 24M; 

    var fakeCreditCard = new CreditCardGold { Money = 15 }; 

    var currentFees = _classUnderTest.Calculate(balance, currentInterestRate, monthlyRepayment, 0M, 1); 
    var balancePositiveCalculator = new BalancePositiveCalculator(_classUnderTest); 
    var costs = balancePositiveCalculator.Calculate(fakeCreditCard, balance, monthlyRepayment); 

    var savingsActual = currentFees.InterestPaid - costs.FeesAndInterest; 

    savingsActual.ShouldBeInRange(savingsExpected - 1M, savingsExpected + 1M); 
} 

Редактировать (Я пробовал это). Является ли это правильный подход:

var fakeCalculatorResult = new CalculatorResult 
{ 
    FeesAndInterest = 12 
}; 

var mockBalancePositiveCalculator = new Mock<IBalancePositiveCalculator>(); 
mockBalancePositiveCalculator 
    .Setup(x => x.Calculate(It.IsAny<CreditCardGold>(), It.IsAny<decimal>(), It.IsAny<decimal>())) 
    .Returns(fakeCalculatorResult); 

// act 
var currentCreditCardCost = _classUnderTest.Calculate(balance, currentInterestRate, monthlyRepayment, 0M, 1); 
var costs = mockBalancePositiveCalculator .Object.Calculate(It.IsAny<CreditCardGold>(), It.IsAny<decimal>(), It.IsAny<decimal>()); 

var savingsActual = currentCreditCardCost.InterestPaid - costs.FeesAndInterest; 

// assert  
savingsActual.ShouldBeInRange(savingsExpected - 5M, savingsExpected + 5M); 
+0

«Должен ли я создать макет из balancePositiveCalculator и параметры настройки и законченный возврат, а затем использовать метод макетного объекта для расчета затрат. FeesAndInterest? Я использую moq. " Именно это, я не уверен в точном синтаксисе в Moq, это должно быть что-то вроде 'balancePositiveCalculator = Moq.Setup ()' и чем вызывать 'Calculate' на mock-объекте, как если бы это был обычный экземпляр , – HimBromBeere

+0

Кажется, у вас есть свои зависимости назад. Было бы разумно, если бы вы тестировали «BalancePositiveCalculator», чтобы затем издеваться над типом '_classUnderTest'. Однако в вашем сценарии просто вызовите методы непосредственно на '_classUnderTest' и удалите любой код, связанный с' BalancePositiveCalculator' –

ответ

1

Да Я согласен с @Lee Campbell - у вас есть свои зависимости назад. То, что вы хотите сделать, - это издеваться над любыми зависимостями в вашем классе, а затем вставлять их. Вот почему контейнеры IOC настолько популярны, когда речь идет о написании кода проверяемого кода. Ваша реализация «_classUnderTest» не имеет зависимостей и поэтому может быть протестирована самостоятельно. Однако «BalancePositiveCalculator» имеет зависимость от «_classUnderTest», и именно это вы хотите издеваться и вводить в «BalancePositiveCalculator».

тест будет выглядеть примерно так:

[TestMethod] 
    public void BalancePositiveCalculator() 
    { 
     var balance = 100M; 
     var monthlyRepayment = 20M; 
     var currentInterestRate = 18.9M; 
     var savingsExpected = 24M; 

     var fakeCreditCard = new CreditCardGold { Money = 15 }; 

     var classUnderTestMock = new Mock<IClassUnderTest>(); 
     classUnderTestMock.Setup(
      test => 
       test.Calculate(It.IsAny<decimal>(), 
        It.IsAny<decimal>(), 
        It.IsAny<decimal>(), 
        It.IsAny<decimal>(), 
        It.IsAny<decimal>())) 
      .Returns(new ClassUnderTest()); 

     classUnderTestMock.Setup(test => test.InterestPaid).Returns(balance); 

     var balancePositiveCalculator = new BalancePositiveCalculator(classUnderTestMock.Object); 
     var costs = balancePositiveCalculator.Calculate(fakeCreditCard, balance, monthlyRepayment); 

     var savingsActual = classUnderTestMock.Object.InterestPaid - costs.FeesAndInterest; 

     savingsActual.ShouldBeInRange(savingsExpected - 1M, savingsExpected + 1M); 

    } 

Который также будет означать, что вы, очевидно, имеет интерфейс, как следующее:

public interface IClassUnderTest 
{ 
    ClassUnderTest Calculate(decimal balance, 
     decimal currentInterestRate, 
     decimal monthlyRepayment, 
     decimal num1, 
     decimal num2); 

    decimal InterestPaid { get; } 
} 
0

Поскольку все, что вы делаете с BalancePositiveCalculator создает сумму, которая получает вычитается из другого количества, вы можете опустить, что полностью. Фактически, вы тестируете только _classUnderTest.Calculate, точнее свойство возвращаемого значения InterestPaid.

Я бы предпочел добавить Assert s для других свойств возвращаемого значения.

Что касается метода BalancePositiveCalculator.Calculate, добавьте там несколько тестов.

Смежные вопросы