【问题标题】:Called method name inside FakeItEasy.Invokes()在 FakeItEasy.Invokes() 中调用方法名称
【发布时间】:2017-12-14 03:20:28
【问题描述】:

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(),即匿名。提供给Invoke 的方法。

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

是否有参数或全局变量,或者我可以访问以查看确实调用了 logger.Error 的东西?

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

【问题讨论】:

    标签: c# .net fakeiteasy


    【解决方案1】:

    很高兴你喜欢 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));
    

    【讨论】:

    • 太棒了! FakeItEasy 让事情变得如此简单,以至于我知道我错过了一些非常简单的东西。 :-) 谢谢。
    猜你喜欢
    • 2011-09-22
    • 2012-02-16
    • 2021-05-28
    • 2016-02-12
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多