![](/img/trans.png)
[英]XUnit how to unit test business object and should I be mocking everything?
[英]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.