2013-03-12 15 views
7

に一致しない:部品番号It.Is <>このコード

hub.MockedUserRepository.Setup(r => r.Update(It.IsAny<ControllUser>())) 
         .Callback((ControllUser usr) => Console.WriteLine("NULL = " + (usr.Zombies[0].ConnectionId == null))) 
         .Verifiable(); 

NULL = Trueの

を出力しますので、私は、このマッチングを使用して考えています、それをキャッチします。

var zombieDisconnectParameterMatcher = It.Is<ControllUser>(x => x.Zombies[0].ConnectionId == null); 
hub.MockedUserRepository.Setup(r => r.Update(zombieDisconnectParameterMatcher)) 
         .Callback((ControllUser usr) => Console.WriteLine("NULL = " + (usr.Zombies[0].ConnectionId == null))) 
         .Verifiable(); 

しかし、 。

なぜですか?

答えて

9

source code of Itを見ると、それは表現木と関係があります。私は質問が好きです。彼らは非常に困惑することができます。あなたは次の行を実行するかどう

public static TValue It.Is<TValue>(Expression<Func<TValue, bool>> match) 
{ 
     return Match<TValue>.Create(
       value => match.Compile().Invoke(value), 
       () => It.Is<TValue>(match)); 
} 

public static T Match.Create<T>(Predicate<T> condition, Expression<Func<T>> renderExpression) 
{ 
     // ... 
     return default(T); 
} 

:あなたは、次のメソッドの定義を見てみたい場合は、

var zombieDisconnectParameterMatcher = It.Is<ControllUser>(x => x.Zombies[0].ConnectionId == null); 

を次にIt.Is<ControllUser>()はデフォルトを返すMatch.Create<ControllUser>()と呼ばれるメソッドを呼び出ししようとしますControllUserControllUserはクラスなので、zombieDisconnectParameterMatchernullとなります。あなたはデバッガでこれを見ることができるはずです。それでは、実際にあなたが呼び出していることです:

hub.MockedUserRepository.Setup(r => r.Update(null)) 
    .Callback((ControllUser usr) => Console.WriteLine("NULL = " + (usr.Zombies[0].ConnectionId == null))) 
    .Verifiable(); 

Updateメソッドを実行するnull以外ControllUser(例えばテストされている方法から)、コールバックがトリガされません。ヌルではないため、条件と一致しません。検証も失敗することがわかります。

この問題を解決するには、変数zombieDisconnectParameterMatcherをインライン化するか、式の型付き変数(たとえば、Expression<Func<...>>)にします。後者は、コードが実行されないようにしますが、モックフレームワークが理由を考えることができる式として扱います( 'UpdateZombies[0].ConnectionId == nullと呼ばれていますか?)。

+0

私はあなたに畏敬の念を浮かべている、サー@カラミエル。 – fernandoespinosa

1

ControllUserインスタンスがどのようにインスタンス化されるかによって異なります。モック内で参照するインスタンスが、テスト対象のコードで参照されている実際のインスタンスでない場合、Setupは失敗します。テスト対象のコードで参照されているControllUserのインスタンスがで、同じオブジェクトがテストコードのインスタンスであることを確認する必要があります。そうでない場合は、最初の例に示すように、It.IsAny<ControllUser>()とコールバックを使用してテストする必要があります。あなたがテストしているコードの多くを見ることなく確実に言うのは難しいです。