C# 如何使用NSubstitute和EventHandler引发事件<;T>;?

C# 如何使用NSubstitute和EventHandler引发事件<;T>;?,c#,unit-testing,events,nsubstitute,C#,Unit Testing,Events,Nsubstitute,我有一个定义多个事件的接口,一些事件具有委托类型EventHandler和T,例如。实现此接口的对象在另一个类中使用,简单的排列如下所示: public interface IEventEmitter { event EventHandler mySimpleEvent; event EventHandler<string> myStringEvent; } public class EventObserver { public IEventEmitter

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

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");
    }
}
    [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); 
    } 
公共接口IEventMitter
{
事件处理程序mySimpleEvent;
事件处理程序myStringEvent;
}
公共类事件观察者
{
公共发射器;
公共int=0;
公共事件观察者(IEVENTER发射器)
{
发射器=发射器;
Emitter.myStringEvent+=(发送者,文本)=>
{
称为++;
WriteLine(“观察到的事件:{0}”,text);
};
Emitter.mySimpleEvent+=(发送方,参数)=>
{
称为++;
Console.WriteLine(“观察到的事件:简单”);
};
控制台。WriteLine(“注册观察员”);
}
}
现在我想用NUnit3和NSubstitute 3.1.0测试代码。用NSubstitute我可以用…呃…替换这些对象。。。替换,我的代码如下所示:

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");
    }
}
    [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); 
    } 
[Test()]
public void EventObserverTest()
{
//安排
IEVENTERMITTER发射器=替换为();
var观察者=新的事件观察者(发射器);
//表演
emitter.mySimpleEvent+=Raise.Event();
//下面这行行不通
emitter.myStringEvent+=Raise.EventWith(“耶”);
//断言
Assert.AreEqual(2,observer.called);
} 
从替代品中提升
mySimpleEvent
效果很好,但我被卡住了,无法理解如何提升
myStringEvent
。(实际上,在代码中,我必须编写的不是字符串而是自定义类型,但我将其归结为这种形式)。使用
Raise.EventWith
语法需要
T
EventArgs
派生(请参阅)

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

//排列
IEVENTERMITTER发射器=替换为();
var观察者=新的事件观察者(发射器);
//表演
emitter.mySimpleEvent+=Raise.Event();
emitter.myStringEvent+=Raise.Event(这个“是”);
//断言
Assert.AreEqual(2,observer.called);