2013-06-17 6 views
1

У меня есть класс обслуживания и класс действия, и действие происходит при срабатывании события. Так что тестовый регистр событий в классе обслуживания важен.Как протестировать событие было зарегистрировано в AssertWasCalled (AAA)?

Я попытался использовать функцию RegisterEvent Rhino Mock, но я не могу выполнить тестовый проход, AssertWasCalled всегда терпит неудачу.

Буду признателен, если кто-нибудь может дать мне рекомендации или ссылки на статьи.

public class ServiceClass 
{ 
    public ActionClass Printer {set; get;} 
    public void RegisterEvent() 
    { 
     Printer = new ActionClass(); 
     Printer.PrintPage += Printer.ActionClass_PrintPage; 
    } 
} 
public class ActionClass 
{ 
    event PrintPageEventHandler PrintPage; 
    public void ActionClass_OnAction(object sender, PrintPageEventArgs e) 
    { 
     // Action here. 
    } 
} 
[Test] 
public void RegisterEvent_Test() 
{ 
    var service = new ServiceClass(); 

    var mockActionClass = MockRepository.GenerateMock<IActionClass>(); 

    service.Printer = mockActionClass; 
    service.RegisterEvent(); 
    mockActionClass.AssertWasCalled(x => x.PrintPage += Arg<PrintPageEventHandler>.Is.Anything); 
} 

ответ

1

Ваша проблема заключается в другом - в RegisterEvent создать новый экземпляр ActionClass который перезаписывает издевался один набор в тесте. Для того, чтобы сделать тест пройти вам нужно просто удалить эту строку из инстанцирования RegisterEvent:

public void RegisterEvent() 
{ 
    // This overrides mock you set in test 
    // Printer = new ActionClass(); 
    Printer.PrintPage += Printer.ActionClass_PrintPage; 
} 
+0

Привет, спасибо за ответ. @srsyogesh упомянул об этом. Тем не менее, Arg <> необходимо изменить в тестовой функции, чтобы заставить ее работать. Я опубликую свой результат. –

+0

В конце концов, в тестировании было что-то еще зажатое, поэтому Arg <> работает. Благодарю. –

1

Изменить

Arg<EventHandler>.Is.Anything 

в

Arg<EventHandler<YourEventArgTypeName>>.Is.Anything 
+0

Спасибо за ответ, я пытался это уже. Но он не может построить. Ошибка EventHandler не назначается параметру PrintPageEventHandler. –

+0

К сожалению. Можете ли вы поделиться своим определением делегата? – srsyogesh

+0

Также одна проблема, которую я мог видеть из кода, - это присвоение принтеру свойства Printer = new ActionClass(); в RegisterEventClass, который будет повторно инициализировать свойство «Принтер» (т. е. хотя вы установили измененный объект, он будет повторно инициализировать, x.PrintPage и Printer.PrintPage в этих утверждениях объекты не совпадают). Поэтому, пожалуйста, удалите эту строку, которую проверит ваш тест. – srsyogesh

0

Благодаря @jimmy_keen заметили мою ошибку, и теперь есть два рабочих утверждение.

Это рабочий раствор ...

public class ServiceClass 
{ 
    public IActionClass Printer {set; get;} 
    public void RegisterEvent() 
    { 
     Printer.PrintPage += ActionClass_PrintPage; 
    } 
} 
public class ActionClass : IActionClass 
{ 
    event PrintPageEventHandler PrintPage; 
    public void ActionClass_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     // Action here. 
    } 
} 
[Test] 
public void RegisterEvent_Test() 
{ 
    var service = new ServiceClass(); 

    var mockActionClass = MockRepository.GenerateMock<IActionClass>(); 

    service.Printer = mockActionClass; 
    service.RegisterEvent(); 
    mockActionClass.AssertWasCalled(x => x.PrintPage += Arg<PrintPageEventHandler>.Is.Anything); // This does work. Credit to @jimmy_keen 
    //mockActionClass.AssertWasCalled(x => x.PrintPage += Arg<EventHandler<PrintPageEventArgs>>.Is.Anything); // Can not compile. 
    mockActionClass.AssertWasCalled(x => x.PrintPage += x.ActionClass_PrintPage); // This works. 
} 
+1

Этот код даже не компилируется - почему свойство 'ServiceClass.Printer' типа' ActionClass' **, а не ** 'IActionClass' (интерфейс)? Если вы насмешливые классы, Rhino обычно не поможет вам с утверждениями/проверками. –

+0

@ jimmy_keen спасибо, что заметили, это была опечатка. Это должен быть IActionClass. –

+1

Вы уверены, что правильно проверили свой код? Я протестировал его (http://pastebin.com/77Nfsx5j) и ваше первое утверждение (* «Не работает» *) ** работает **. –

Смежные вопросы