2015-01-30 4 views
2

я могу сделать следующее, чтобы проверить, является ли ErrorOccurred событие моего Consumer класса было поднято:Использования FakeItEasy утверждать, что событие было поднято

using System; 
using FakeItEasy; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

public interface IService 
{ 
    event EventHandler SomethingBadHappened; 
} 

class Consumer 
{ 
    private readonly IService service; 

    public Consumer(IService service) 
    { 
     this.service = service; 
     service.SomethingBadHappened += (sender, args) => RaiseErrorOccurred(); 
    } 

    public event EventHandler ErrorOccurred; 

    protected virtual void RaiseErrorOccurred() 
    { 
     var handler = ErrorOccurred; 
     if (handler != null) handler(this, EventArgs.Empty); 
    } 
} 

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var service = A.Fake<IService>(); 
     var consumer = new Consumer(service); 

     bool eventWasRaised = false; 
     consumer.ErrorOccurred += (sender, args) => { eventWasRaised = true; }; 

     service.SomethingBadHappened += Raise.WithEmpty(); 

     Assert.IsTrue(eventWasRaised); 
    } 
} 

Интересно, если есть более «Mocking Framework-у» способ сделать это. Что-то вроде ниже будет приятно:

 var service = A.Fake<IService>(); 
     var consumer = new Consumer(service); 

     service.SomethingBadHappened += Raise.WithEmpty(); 

     consumer.ErrorOccurred.MustHaveHappened(/*yada yada/*); 

ответ

6

Для FakeItEasy выполнять какие-либо утверждения о методах, этот метод должен быть fakeable, и определяется на поддельный объекте. В этом случае consumer является «реальным» объектом, поэтому FakeItEasy не может знать, что он сделал.

Есть альтернатива, но является ли это более «Mocking Framework-y» или нет, для обсуждения. Но он может понравиться вам.

Создать подделку (в данном случае handler) слушать метод ErrorOccurred:

[TestMethod] 
public void TestMethod2() 
{ 
    var service = A.Fake<IService>(); 
    var consumer = new Consumer(service); 

    var handler = A.Fake<EventHandler>(); 
    consumer.ErrorOccurred += handler; 

    service.SomethingBadHappened += Raise.WithEmpty(); 

    A.CallTo(()=>handler.Invoke(A<object>._, A<EventArgs>._)).MustHaveHappened(); 
} 

Таким образом, вы можете проверить, если handler называли. Существуют прямые изменения, которые могут быть сделаны для обеспечения того, чтобы звонок был сделан specific number of times, или с certain arguments.

Конечно, если вас не волнует количество раз, когда метод был вызван, или аргументы, поскольку на handler существует действительно один интересный метод, вы можете использовать этот более простой вызов, который будет соответствовать любой вызов обработчика (вероятно Invoke):

A.CallTo(handler).MustHaveHappened(); 
+0

Это действительно выглядит более привлекательным для меня из-за самого факта вы упомянули: обеспечение, что вызов был сделан определенное количество раз или с определенными аргументами. Спасибо за полный ответ! –

+1

Рад помочь, @JoaoMilasch. Повеселись. –

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