2016-10-20 10 views
0

私は嘲笑するのが初めてです。私は単位テストに変更したい統合テストをしています。 balancePositiveCalculatorは、classUnderTestとの依存関係に協力しているので、私は黙らせなければならないことを知っていますが、私はここでどのように偽装するのか分かりませんので、classUnderTestをテストしています。私はbalancePositiveCalculatorと設定パラメータと缶詰の戻り値の模擬を作成し、次に擬似オブジェクトメソッドを使用してコストを計算する必要がありますか?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と設定パラメータとcanned returnを使用して、モックオブジェクトメソッドを使用してコストを計算します.FeesAnterest?moqを使用しています。正確には、私はMoqの正確な構文については分かりませんが、それは 'balancePositiveCalculator = Moq.Setup ()'のようなものでなければならず、通常のインスタンスのように模擬オブジェクトの 'Calculate' 。 – 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で行うすべては別の金額から差し引かれます量を作成しているので、あなたは完全にそれを省略することができます。効果的には、戻り値のInterestPaidプロパティだけを_classUnderTest.Calculateでテストします。

戻り値のその他のプロパティには、Assertをいくつか追加することをお勧めします。

BalancePositiveCalculator.Calculateメソッドについては、そこにいくつかのテストを追加します。

関連する問題