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);