我试图触发分配给我的计时器模拟的事件处理程序.我如何在这里测试这个私有方法?
public interface ITimer
{
void Start();
double Interval { get; set; }
event ElapsedEventHandler Elapsed;
}
Run Code Online (Sandbox Code Playgroud)
客户端类为此对象分配事件处理程序.我想测试这个类中的逻辑.
_timer.Elapsed += ResetExpiredCounters;
Run Code Online (Sandbox Code Playgroud)
分配的方法是私有的
private void ResetExpiredCounters(object sender, ElapsedEventArgs e)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
我希望在我的模拟中有这个事件处理程序并以某种方式运行它.我怎样才能做到这一点?
更新:
在分配事件处理程序之前,我意识到我正在提升事件.我纠正了这个,但我仍然得到这个错误:
System.ArgumentException : Object of type 'System.EventArgs' cannot be converted
to type 'System.Timers.ElapsedEventArgs'.
Run Code Online (Sandbox Code Playgroud)
我这样举起来:
_timer.Raise(item => item.Elapsed += null, ElapsedEventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)
要么
_timer.Raise(item => item.Elapsed += null, EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)
两者都行不通.
更新:
这对我有用.请注意,如果您尝试将信息传递给事件处理程序(如Jon在评论中指出),则无效.我只是用它来模拟System.Timers.Timer类的包装器.
_timer.Raise(item => item.Elapsed += null, new EventArgs() as ElapsedEventArgs);
Run Code Online (Sandbox Code Playgroud)
最后,如果你需要使用事件参数,这根本不会有用,因为它总是为null.但是,这是自ElapsedEventArgs只有一个内部构造函数以来的唯一方法.
我正在尝试创建一个注入了依赖项的WPF MVVM视图模型System.Timing.Timer,并希望使用Moq测试视图模型.
我在Timer具有接口的类中编写了一个薄的包装器ITimer,但我不确定真正测试计时器对类的贡献的最佳方法.是否有一种很好的方法可以"逼迫"模拟过去的事件?别人有更好的技术吗?