簡體   English   中英

如何通過模擬使該集成測試單元測試?

[英]How do I make this integration test unit test with mocking?

我是新來的嘲笑。 我正在進行集成測試,我想更改為單元測試。 我知道我必須模擬balancePositiveCalculator,因為它與classUnderTest合作依賴,但是我不確定如何在這里模擬,因此我僅測試classUnderTest。 我是否必須創建balancePositiveCalculator和設置參數以及固定收益率的模擬,然后使用模擬對象方法來計算cost.FeesAndInterest? 我正在使用起訂量。

[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);

是的,我同意@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; }
}

由於您對BalancePositiveCalculator所做的全部工作都是創建一個要從另一個金額中減去的金額,因此您可以完全省略該金額。 有效地,您僅測試_classUnderTest.Calculate ,更准確地測試其返回值的InterestPaid屬性。

我希望為返回值的其他屬性添加一些Assert

至於BalancePositiveCalculator.Calculate方法,在此處添加一些測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM