FakeItEasy.Invokes()中调用的方法名称

时间:2017-12-13 18:35:00

标签: c# .net fakeiteasy

FakeItEasy太棒了。一个大"谢谢"对所有贡献者。

话虽如此,我遇到了一个用例,我想从配置了Invokes的lambda内部知道实际调用伪造对象的方法,而不必显式配置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");

Invokes的lambda中,我希望能够告诉界面上调用了什么方法。换句话说,我该如何实施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的方法。

但是,当CurrentMethodName被称为FakeItEasy时,必须能够知道伪造的是什么......

是否有参数或全局变量,或者我可以访问的内容,看到确实调用了logger.Error

此外,我可以列出调用它的参数值吗?

1 个答案:

答案 0 :(得分:3)

很高兴你喜欢FakeItEasy。

有多个Invokes重载。如果你使用一个接听电话Action,你可以实现你想要的:

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

call参数对调用有很多了解,包括传入的参数,可通过call.Argumentscall.GetArgument访问。

或者,您可以使用接受匹配数量的参数的操作直接获取参数(最多4个):

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