如何使用NSubstitute和EventHandler <t>引发事件?

时间:2018-08-20 11:55:14

标签: c# unit-testing events nsubstitute

我有一个定义多个事件的接口,其中一些事件的委托人类型为EventHandler<T>,委托人类型为T,例如<string>。实现此接口的对象用在另一个类中,一个简单的安排如下所示:

public interface IEventEmitter
{
    event EventHandler mySimpleEvent;
    event EventHandler<string> myStringEvent;
}

public class EventObserver
{
    public IEventEmitter Emitter;
    public int called = 0;
    public EventObserver(IEventEmitter emitter)
    {
        Emitter = emitter;

        Emitter.myStringEvent += (sender, text) =>
        {
            called++;
            Console.WriteLine("Observed event: {0}", text);
        };

        Emitter.mySimpleEvent += (sender, args) =>
        {
            called++; 
            Console.WriteLine("Observed event: simple");
        };
        Console.WriteLine("Registered observer");
    }
}

现在,我想使用NUnit3和NSubstitute 3.1.0测试代码。使用NSubstitute,我可以用... eh ...替换这些对象,我的代码如下:

    [Test()]
    public void EventObserverTest()
    {
        // Arrange
        IEventEmitter emitter = Substitute.For<IEventEmitter>();
        var observer = new EventObserver(emitter);
        // Act
        emitter.mySimpleEvent += Raise.Event();
// the following line doesn't work
        emitter.myStringEvent += Raise.EventWith<EventHandler<string>>("Yeah");
        // Assert
        Assert.AreEqual(2, observer.called); 
    } 

通过替代人筹集mySimpleEvent的效果很好,但是我被困住了,无法弄清楚如何筹集myStringEvent。 (实际上,在代码中,我必须编写的不是字符串而是自定义类型,但我将其简化为这种形式。)

1 个答案:

答案 0 :(得分:1)

Raise.EventWith<TEventArgs>语法要求T源自EventArgs(请参阅source)。

要使用非EventArgs和我们可以使用的其他委托类型,可以使用Raise.Event<TDelegate>,如Raising Delegate events中所述:

// Arrange
IEventEmitter emitter = Substitute.For<IEventEmitter>();
var observer = new EventObserver(emitter);
// Act
emitter.mySimpleEvent += Raise.Event();
emitter.myStringEvent += Raise.Event<EventHandler<string>>(this, "Yeah");
// Assert
Assert.AreEqual(2, observer.called);