2009-08-16 13 views
9

モックオブジェクトでメソッド呼び出しの期待値を設定する際に、Ienumerable/Array型のパラメータを検証する際に問題があります。それはそれがマッチとはみなされない異なる参照と一致しているので、私は思う。配列の内容に一致させたいだけで、時には順序について気にしないこともあります。メソッド設定の配列/ IEnumerableパラメータの一致と検証

mockDataWriter.Setup(m => m.UpdateFiles(new string[]{"file2.txt","file1.txt"})); 

理想的には、次のようなものがほしいと思うので、おそらくこれを行う拡張メソッドを書くことができます。

It.Contains(new string[]{"file2.txt","file1.txt"}) 

It.ContainsInOrder(new string[]{"file2.txt","file1.txt"}) 

だけ私は今これらを一致させることができますように構築されたザ・述語機能であるが、この問題は、それが組み込まれるべき十分な一般的なようです。

一致させる方法で構築ありますこれらのタイプ、または私が使用できる拡張ライブラリ。そうでない場合は、拡張メソッドなどを書くだけです。

おかげでいくつかのカスタムマッチャを実装する必要がありました

+1

この質問/答えは全く場合に役立ちます参照してください。http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

答えて

7

は、リソースとしてhttp://code.google.com/p/moq/wiki/QuickStartを使用したバージョン3でこれを実現するための方法で構築された他のを発見していません。

public T[] MatchCollection<T>(T[] expectation) 
{ 
    return Match.Create<T[]>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 

public IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 


public void MyTest() 
{ 

... 

mockDataWriter.Setup(m => m.UpdateFiles(MatchCollection(new string[]{"file2.txt","file1.txt"}))); 

... 


} 
+0

これは、期待される値がすべてinputCollectionにあるかどうかをチェックするだけで、それ以外の方法ではありません。 inputCollectionには、まだ期待していない項目が含まれている可能性があります。 –

3

あなたがアレイとIEnumerableをのための2つの別々の方法は必要ありません。

private static IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => expectation.All(inputCollection.Contains)); 
} 
4

をオレグによる以前の答えはinputCollectionexpectationではない要素を持っている場合は処理されません。例えば

:それは明確にすべきでない

MatchCollection(new [] { 1, 2, 3, 4 }) 

がinputCollection { 1, 2, 3, 4, 5 }と一致します。

はここで完全な正規表現エンジンの:

public static IEnumerable<T> CollectionMatcher<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create((IEnumerable<T> inputCollection) => 
         !expectation.Except(inputCollection).Any() && 
         !inputCollection.Except(expectation).Any()); 
} 
+0

特別なケースを取り扱っていただきありがとうございます。 – saxos

関連する問題