lar*_* k. 5 c# events unit-testing nsubstitute
我有一个定义多个事件的接口,其中一些事件具有委托类型,EventHandler<T>例如. 实现此接口的对象在另一个类中使用,简单的安排如下: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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想用 NUnit3 和 NSubstitute 3.1.0 测试代码。使用 NSubstitute,我可以用……呃……替代品来替换这些对象,我的代码如下所示:
[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);
}
Run Code Online (Sandbox Code Playgroud)
从替补中加注的mySimpleEvent效果非常好,但我被困住了,不知道如何加注myStringEvent。(实际上,在代码中我必须编写的不是字符串而是自定义类型,但我将其归结为这种形式)。
Dav*_*pak 10
语法Raise.EventWith<TEventArgs>需要T派生自EventArgs(参见源代码)。
要使用非委托EventArgs类型和其他委托类型,我们可以使用Raising eventsRaise.Event<TDelegate>中所述的方法:Delegate
// 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3929 次 |
| 最近记录: |