由于ElapsedEventArgs未重新声明为空,在单元测试中调用elapsed Timer事件失败



上下文是,我试图单元测试一个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/

最新更新