2015-04-23 4 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 легко сообщает об ошибке «Нет вызовов для поддельного объекта».

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