【问题标题】:FakeItEasy error: No calls were made to the fake objectFakeItEasy 错误:没有调用假对象
【发布时间】:2015-04-23 06:35:53
【问题描述】:

我有一个小类,它有一个小方法,在引发事件时会被调用。

public class DemoUI
{
    public DemoUI(TestRunner runner)
    {
        runner.UserMessage += OnEventRunThis;
    }

    protected void OnEventRunThis(object sender, UserMessageEventArgs e)
    {
        Console.WriteLine(e.Message);
    }
}

现在在我的测试中,我创建了一个TestRunner 类型的对象并对其执行Execute 方法。这引发了一个事件,然后被拦截,OnEventRunThis 尽职尽责地运行打印消息。但是 Fake it easy 报错“No call were made to the fake object”。

var _sutTestRunner = new TestRunner();
var fakeDemoUI = A.Fake<DemoUI>(x => x.WithArgumentsForConstructor(() => new DemoUI(_sutTestRunner)));

_sutTestRunner.Execute();

A.CallTo(fakeDemoUI).Where(x => x.Method.Name == "OnEventRunThis").MustHaveHappened();

方法OnEventRunThis 被调用,因为我看到输出正在输出窗口中打印。因此,在我有限的理解中,这意味着已对 Fake 对象进行了调用。

或者我错过了什么?或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: c# unit-testing mocking fakeiteasy


    【解决方案1】:

    我认为我看到了两个问题:

    1. 您似乎正在检查方法调用是否发生在您运行Execute 之前。由于Execute 引发了触发方法调用的事件,因此尚未进行调用。
    2. OnEventRunThis 不是虚拟的,因此 FakeItEasy 无法覆盖它并因此拦截调用。这就是您看到控制台消息的原因——原始代码正在运行。

    你最好用类似的东西:

    public class DemoUI
    {
        public DemoUI(TestRunner runner)
        {
            runner.UserMessage += OnEventRunThis;
        }
    
        protected virtual void OnEventRunThis(object sender, UserMessageEventArgs e)
        {
            Console.WriteLine(e.Message);
        }
    }
    
    …
    
    var _sutTestRunner = new TestRunner();
    var fakeDemoUI = A.Fake<DemoUI>(x =>
        x.WithArgumentsForConstructor(() => new DemoUI(_sutTestRunner)));
    
    _sutTestRunner.Execute();
    
    A.CallTo(fakeDemoUI)
        .Where(x => x.Method.Name == "OnEventRunThis")
        .MustHaveHappened();
    

    【讨论】:

    • 使测试重构友好:A.CallTo(() => fakeDemoUI.OnEventRunThis(A._, A._)).MustHaveHappend()
    • 我打算建议这个,@Urs,但它需要公开OnEventRunThis
    • 使方法虚拟解决了这个问题。执行确实发生在 A.CallTo 之前。输入问题时我很累。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多