.net 由于ElapsedEventArgs未重新声明Empty,在单元测试中调用经过的Timer事件失败

3df52oht  于 2023-04-13  发布在  .NET
关注(0)|答案(1)|浏览(154)

上下文是我试图对System.Timers.Timer的运行时间事件处理程序进行单元测试
我遵循了https://stackoverflow.com/a/9088455/1713336中的答案,它建议通过创建Timer Package 器并使用timerFake.Elapsed += Raise.With<ElapsedEventArgs>(ElapsedEventArgs.Empty).Now;(注意,这是FakeItEasy)来调用事件
我试过了。
不幸的是,这会导致编译器错误,声明为Argument type 'System.EventArgs' is not assignable to parameter type 'System.Timers.ElapsedEventArgs'
如果你看一下Nonsense error message when manually calling EventHandler,你会发现System.Timers.ElapsedEventArgs没有重新声明Empty,我相信这就是为什么会出现这个错误。
是否有解决此问题的方法?我仍然希望调用经过的计时器事件

fjaof16o

fjaof16o1#

在@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)触发计时器的Elapsed处理程序;其中args是使用反射创建的ElapsedEventArgs
Raise.FreeForm引发使用自定义委托定义的事件,如下所述https://fakeiteasy.github.io/docs/7.3.1/raising-events/

相关问题