2017-12-13 7 views
2

FakeItEasyは素晴らしいです。すべての寄稿者に大きな「ありがとう」。FakeItEasy.Invokes()内の呼び出されるメソッド名

私はInvokesで構成されたラムダの内部から実際にどのような方法で呼び出されたかを知りたいユースケースを見つけました。すべてのメソッドに対して明示的にInvokesを設定する必要はありません。私が呼ばれたインターフェイス上でどのような方法で伝えることができるようにしたいと思い、Invokesのためのラムダインサイド

public interface ILogger { 
    void Info(string msg); 
    void Error(string msg); 
} 

var logger = A.Fake<ILogger>(); 

A.CallTo(logger).Invokes(
    () => { 
     Debug.WriteLine(CurrentMethodName); 
     // CurrentMethodName should return "Error", or "Info", as appropriate 
    }); 

logger.Error("Error"); 

:ここ

は、私が何を意味するかの簡単な例です。つまり、 CurrentMethodNameを実装するにはどうすればよいですか?

これは私が試したものです:

public string CurrentMethodName 
{ 
    get 
    { 
     StackTrace st = new StackTrace(); 
     StackFrame sf = st.GetFrame(1); 
     return sf.GetMethod().Name; 
    } 
} 

それが動作しない理由はlogger.Errorは、この時点で、すべてのコールスタックではないということです。コールスタックにあるものは、blah_blah_blah.AnonymousMethod__7_0()のようなものです。これはanonです。メソッドを提供しています(Invoke)。

しかし、時間CurrentMethodNameFakeItEasyが偽造されているかを知ることができなければならないと呼ばれている...

は、パラメータ、またはグローバル変数、または私は実際にlogger.Errorが呼び出されたことを確認するためにアクセスできるものがあります?

さらに、呼び出された引数の値をリストできますか?

答えて

2

喜んでFakeItEasyを楽しもう。

複数の過負荷があります。あなたは、受信した呼にActionをとるものを使用する場合は、あなたが望むものを達成することができます:

A.CallTo(logger).Invokes(call => 
    Debug.WriteLine(call.Method.Name)); 

callパラメータがcall.Argumentsまたはcall.GetArgument経由でアクセス可能に渡される引数を含む呼び出し、について多くのことを知っています。

A.CallTo(logger).Invokes((string message) => Debug.WriteLine(message)); 
+0

ファンタスティック:

また、あなたは(それらの4まで)直接パラメータの一致数を受け入れアクションを使用して引数を取得することができます! FakeItEasyは物事をとても簡単にして、私が何か非常に単純なものを見逃していたことを知っていました。 :-) ありがとうございました。 – Optimax

関連する問題