2017-07-03 8 views
3

でそれを示していますアクションとフェイクそれが簡単に - 私はそうのようなことが簡単に偽の使用している、それが呼び出す見つけることができません言うが、リスト

var callBackAction = A.Fake<Action<object>>(); 

//act 
token.RegisterChangeCallback(callBackAction, "hi"); 

//assert 
A.CallTo(() => callBackAction.Invoke(A<object>.Ignored)).MustHaveHappened(); 

と私はエラーに

FakeItEasy.ExpectationException : Assertion failed for the following call: 

    System.Action`1[System.Object].Invoke(obj: <Ignored>) Expected to find it 

    exactly once but found it #0 times among the calls: 

      1:  System.Action`1[System.Object].Invoke(obj: "hi) 
を取得しています

これは私にとって非常に奇妙なようです。私はそれが何も見つけなかったか、またはそれがequals()をオーバーライドすることと関係があるかどうかを理解することができましたが、それは明らかに私の呼び出しを見つけたので、これは非常に奇妙で、無視しています。 これはアクションの使用と関係がありますか?

+0

これは単純な例かもしれないが、私はここでその行動を嘲笑する必要はないと思う。デリゲートを作成し、それが呼び出されたことを確認するフラグを使用するだけです。 – Nkosi

+0

私はこれを最初に試してみましたが、スレッディングのためにうまくいかず、簡単に偽の問題になっていました。実際に私を投げたのはエラーメッセージでした。 –

答えて

4

これは、スレッドが生成され、条件を待ってそのスレッドでアクションが呼び出されるためです。テスト中にこの状態は直ちに真であり、従ってスレッドは非常に迅速に戻る。これは、テストが失敗するようにスレッドが作成された直後に行われるように、資産が真であるほど十分に速くはありません。しかし、アサートが失敗し、FakeItEasyがエラーメッセージのために起こったコールを収集する前に、アクションが呼び出されます。これによりFakeItEasyは、呼び出されていないためにテストが失敗したにもかかわらず、エラーメッセージの一部として呼び出されたことを示します。

これは私の考えです。 Diagram of threads

+1

あなたの前提は正しいようです。私は問題を再現することができます(必ずしもそうではありませんが、時には競合状態が予想されるため)。私はGithubに関する問題をオープンしました:https://github.com/FakeItEasy/FakeItEasy/issues/1159 –

関連する問題