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

标签 c# .net fakeiteasy

FakeItEasy 很棒。非常感谢所有贡献者。

话虽如此,我遇到了一个用例,我想从配置了 Invokes 的 lambda 内部知道实际调用了伪造对象的什么方法,而不必显式配置 为每个方法调用

这是我的意思的一个简单例子:

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 内部,我希望能够知道调用了接口(interface)上的哪个方法。换句话说,我如何实现 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

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

最佳答案

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

关于c# - FakeItEasy.Invokes() 中调用的方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47799971/

相关文章:

已被覆盖的 C# FakeItEasy 假方法

unit-testing - 非虚方法不能被拦截

c# - 如何使用 ActionResult<T> 进行单元测试?

c# - 如何从 ASP.NET 4.0 中的 session 获取值并将其存储到文本框/标签

c# - 类似于visual studio的对接控件

c# - 使用 ASP.NET Core 3 流式传输视频

c# - 为什么 .NET (Core) 中的大多数 mock 框架都不能 mock static 和 private 方法?

c# - 在显示之前操作 DisplayMember

c# - Controller 上的相同类型 Action 过滤器及其 Action 方法

c# - 我如何翻译 newButton.Click += delegate { window.IsOpen = false; };在 vb.net 中