2012-04-17 15 views
1

私は私がテストしているメソッドで呼び出されているプラ​​イベートメソッドを持っています。私はこのプライベートメソッドに渡されている正しいパラメータを確認したいです。私はMoqに以下の設定を書いています。これは私が望むものをテストしますが、実際にはアレンジ、アクト、アサートのパターンに従うことはできません。Moqでこのテストを書くには、より良い方法がありますか?

私は他のすべてのアサーションでアサーションが表示される類似のテストを実行する方法はありますか?現時点では、以下のコードはArrange内に存在します。私が言うべき

 myClass.Setup(
       x => 
       x.myMethod(
        It.IsAny<Person>>(), 
        It.IsAny<string>(), 
        It.IsAny<Person>(), 
        It.IsAny<ICollection<string>>(), 
        It.IsAny<ICollection<string>>(), 
        It.IsAny<bool>())).Callback 
       <Person, string, Person, Person, ICollection<string>, bool>(
        (a, b, c, d, e, f) => 
         { 
          Assert.AreEqual("NameA", a.Name); 
          Assert.AreEqual("StringB", b); 
          Assert.AreEqual("NameC", c.Name); 
          Assert.AreEqual(2, d); 

          var dList = d.ToList().OrderBy(x => x.Name); 
          Assert.AreEqual("PersonA", dList[0].Name) 
          Assert.AreEqual("PersonB", dList[1].Name); 
         }); 

、私はあなたの方法は、特定の入力で呼び出されたかどうかを確認するために検証をperfomできることを承知しています、しかし私は、ICollectionをparamsはを一致させる任意の方法を認識していないです。

答えて

3

これらのアサーションを使用してパラメータを確認している場合は、セットアップで行うことができます。モックが厳密な振る舞いを使用する場合、パラメータが述語と一致しないと失敗します。

// declare your mock with strict behavior 

myClass.Setup(
    x => 
    x.myMethod(
     It.Is<Person>(person => person.Name == "NameA"), 
     "Stringb", 
     It.Is<Person>(person => person.Name == "NameC"),, 
     It.Is<ICollection<string>>(coll =>{ 
       //your other validations 
      }), 
     It.IsAny<ICollection<string>>(), 
     It.IsAny<bool>())); 
2

単体テストの目的は、クラスが期待どおりに動作することを確認することです。あなたはその公開インターフェースを介してクラスを行使し、物事を以下のチェックする必要があります:

  • クラスの状態が
  • を変える期待通りにクラスの動作中に他のものは値を持たない依存関係へ
  • 通話

結果を返しました。あなたはあなたのクラスをリファクタリングし、そのプライベートメソッドをインラインで作ることができます。

+0

こんにちは、ありがとうございます。あなたは正しいです、私はプライベートメソッドをテストするべきではありません。私はこの例を書くときに間違いを犯しました。それは実際に私がテストしようとしていた依存関係です。この場合、Ufukの回答が役に立ちます。 – user460667

+0

@ user460667問題はありません。テストするべきでないものをテストしないよう他人に助言してください:) –

関連する問題