Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FakeiTasy错误:未调用假对象_C#_Unit Testing_Mocking_Fakeiteasy - Fatal编程技术网

C# FakeiTasy错误:未调用假对象

C# FakeiTasy错误:未调用假对象,c#,unit-testing,mocking,fakeiteasy,C#,Unit Testing,Mocking,Fakeiteasy,我有一个小类,它有一个小方法,在引发事件时被调用 public class DemoUI { public DemoUI(TestRunner runner) { runner.UserMessage += OnEventRunThis; } protected void OnEventRunThis(object sender, UserMessageEventArgs e) { Console.WriteLine(e.

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

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报告错误“没有调用假对象”

var\u sutTestRunner=newtestrunner();
var fakeDemoUI=A.Fake(x=>x.WithArgumentsForConstructor(()=>newdemoui(_sutTestRunner));
_sutTestRunner.Execute();
A.CallTo(fakeDemoUI).Where(x=>x.Method.Name==“OnEventRunThis”).musthaveOccurd();
调用方法
OnEventRunThis
,因为我看到输出窗口中打印了输出。因此,在我有限的理解中,这意味着调用了假对象


还是我遗漏了什么?还是有其他方法可以解决这个问题?

我想我看到了两个问题:

  • 您似乎正在检查方法调用是否发生在运行
    Execute
    之前。由于
    Execute
    引发触发方法调用的事件,因此尚未进行调用
  • OnEventRunThis
    不是虚拟的,因此FakeiTesy无法覆盖它,从而拦截呼叫。这就是为什么您会看到控制台消息原始代码正在运行
  • 你最好做些如下的事情:

    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();
    
    公共类DemoUI
    {
    公共演示(TestRunner)
    {
    runner.UserMessage+=OnEventRunThis;
    }
    受保护的虚拟void OnEventRunThis(对象发送方,UserMessageEventArgs e)
    {
    控制台写入线(e.Message);
    }
    }
    …
    var_sutTestRunner=新的TestRunner();
    var fakeDemoUI=A.Fake(x=>
    x、 使用ArgumentsForconstructor(()=>new DemoUI(_sutTestRunner));
    _sutTestRunner.Execute();
    A.CallTo(伪造)
    .Where(x=>x.Method.Name==“OnEventRunThis”)
    .一定发生过();
    
    使测试重构友好:A.CallTo(()=>fakeDemoUI.OnEventRunThis(A..\uu,A.\u)).musthavehappendd()我本来想建议这样做,@Urs,但它需要将
    OnEventRunThis
    公开。使方法虚拟化解决了这个问题。Execute确实发生在A.CallTo之前。我打字时很累。
    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();