2017-12-13 12 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이 시점에서 모든 호출 스택에없는 것입니다. 호출 스택에있는 내용은 anton 인 blah_blah_blah.AnonymousMethod__7_0()과 같습니다. 메서드를 Invoke에 제공합니다.

그러나, FakeItEasy가 위조되고 있는지 알 수 있어야합니다라고 CurrentMethodName 시간 ...에

내가 참으로 logger.Error가 호출되었음을보고 액세스 할 수있는 매개 변수 또는 전역 변수, 또는 뭔가가 있나요 ?

또한, 내가 호출 된 인수의 값을 나열 할 수 있습니까?

답변

2

기쁘게 생각합니다. FakeItEasy.

과부하가 몇 가지 있습니다 (Invokes). 당신이 수신 통화에 발생하는 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