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();