如何使用带有 EventHandler<T> 的 NSubstitute 引发事件?

lar*_* k. 5 c# events unit-testing 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想用 NUnit3 和 NSubstitute 3.1.0 测试代码。使用 NSubstitute,我可以用……呃……替代品来替换这些对象,我的代码如下所示:

    [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); 
    } 
Run Code Online (Sandbox Code Playgroud)

从替补中加注的mySimpleEvent效果非常好,但我被困住了,不知道如何加注myStringEvent。(实际上,在代码中我必须编写的不是字符串而是自定义类型,但我将其归结为这种形式)。

Dav*_*pak 10

语法Raise.EventWith<TEventArgs>需要T派生自EventArgs(参见源代码)。

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

// 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);
Run Code Online (Sandbox Code Playgroud)