2015-04-23 50 views
0

我有一个小的类有一个小的方法,当事件引发时被调用。FakeItEasy错误:没有打电话给假对象

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 _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对象进行了调用。

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

回答

2

我想我看到了两个问题:

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

使测试重构友好: A.CallTo(()=> fakeDemoUI.OnEventRunThis(A ._,A 。)MustHaveHappend() – Urs

+0

我打算建议这个@Urs,但它需要公开'OnEventRunThis'。 –

+0

使方法虚拟解决问题。执行确实发生在A.CallTo之前。在输入问题时我很累。 – NotAgain