2017-10-31 10 views
0

私はこれに従いますintro to unit testingチュートリアル。すべての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の実装、まだ部品番号テストpassessを持っていません!これらのコードで何が間違っているのか説明できますか?

+0

コードに問題はないようです。実行するように設定したときと同じように実行されます。あなたはモックを使用している理由を実装する必要はありません。テスト中のクラス 'CreditDecision'には' MakeCreditDecision'メソッドをテストするための擬似依存関係が注入されています。 – Nkosi

+0

これは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のようです。あなたが達成しようとしている究極の目標は何ですか? – Nkosi

+0

私は '' '(creditScore)が" Mabye "..... .....' 'を返す必要がない理由を理解しようとしていました。 Moqを理解すること以外に何も達成しようとしていない。 – DevelopZen

答えて

1

私の知る限り、あなたのコードは設計/書かれたとおりに動作しています。 ICreditDecisionServiceのモックを作成し、それぞれの場合に何を返すべきかを教えています。一方、試験は2つのことが起こるアサートされる:

  1. CreditDecision.MakeCreditDecision()(この場合、常に正しい/既知の値を返すように嘲笑)ICreditDecisionServiceによって生成された値を返します。

  2. CreditDecision.MakeCreditDecision()を呼び出すと、creditScoreの正しい値を持つICreditDecisionService.GetCreditDecision()が呼び出されます。

したがって、あなたのテストはCreditDecisionないICreditDecisionServiceをテストしています。 CreditDecisionをテストするためにICreditDecisionServiceの実装は必要ありません。実際の実装が何であっても、CreditDecisionをテストするためにCreditDecisionICreditDecisionServiceから隔離しています。

ただし、テストで実際に起こっていることを反映するためにテスト名を変更します。おそらくMakeCreditDecision_Returns_Result_From_Serviceのようなものがより良い説明になります。

+0

"' 'ICreditDecisionService'''をテストしていません。意味あり。ありがとうございました! – DevelopZen

関連する問題