如何使用带有 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>
语法要求 T
从 EventArgs
派生(参见 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);
我有一个定义多个事件的接口,一些事件的委托类型为 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>
语法要求 T
从 EventArgs
派生(参见 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);