我有一个定义多个事件的接口,其中一些带有T
的委托类型EventHandler<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
。(实际上,在我必须编写的代码中,它不是一个字符串,而是一个自定义类型,但我将其简化为以下形式)。
发布于 2018-08-20 21:32:49
Raise.EventWith<TEventArgs>
语法要求T
从EventArgs
派生(请参见source)。
要使用非EventArgs
和其他可以使用的委托类型,可以使用Raising Delegate
events中描述的Raise.Event<TDelegate>
// 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);
https://stackoverflow.com/questions/51930227
复制相似问题