上下文是,我试图单元测试一个System.Timers。定时器的经过事件处理程序
我遵循https://stackoverflow.com/a/9088455/1713336中的答案,该答案建议通过创建计时器包装器和(注意这是FakeItEasy)使用timerFake.Elapsed += Raise.With<ElapsedEventArgs>(ElapsedEventArgs.Empty).Now;
调用事件
我已经试过了。
不幸的是,这会导致编译器错误声明Argument type 'System.EventArgs' is not assignable to parameter type 'System.Timers.ElapsedEventArgs'
当你手动调用EventHandler时,如果你看一下无意义的错误信息,你会发现system . timer . elapsedeventargs没有重新声明为空,我相信这就是为什么这个错误出现的原因。
有办法解决这个问题吗?我仍然想调用Elapsed timer事件
在@Hans Passant的帮助下,我想出了一个解决方案
首先我们创建一个具有反射
的ElapsedEventArgs
对象var ctor = typeof(ElapsedEventArgs).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).First();
var args = (ElapsedEventArgs)ctor.Invoke(new object[] {DateTime.Now});
然后我引发了一个事件来触发定时器的流逝处理程序与timerFake.Elapsed += Raise.FreeForm.With(this, args)
;其中args
是通过反射创建的ElapsedEventArgs
。
Raise.FreeForm
引发用自定义委托定义的事件,如下所示https://fakeiteasy.github.io/docs/7.3.1/raising-events/