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

How to raise an event with NSubstitute with EventHandler<T>?

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

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。 (其实在代码中我要写的不是字符串而是自定义Type,但是我把它归结为这种形式)。

Raise.EventWith<TEventArgs> 语法要求 TEventArgs 派生(参见 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);