从system . timer . elapsedeventargs继承,使单元测试更容易
本文关键字:单元测试 更容易 继承 system timer elapsedeventargs | 更新日期: 2023-09-27 17:51:19
当我尝试从System.Timers.ElapsedEventArgs继承时,我无法创建一个有效的类,因为唯一的构造函数是内部的(从1获取)
我想这样做,因为我想能够创建一个类的实例,我派生,并传递它作为一个参数时调用定时器的经过的事件进行单元测试。
为了帮助测试,我创建了一个间接层,将不同的事件作为类的属性,可以使用公共方法调用。我知道这不是现在做事情的正确方法,但我想让测试工作,然后我要找出一种方法来代替系统时钟/计时器。
新事件作为属性:
public event System.Timers.ElapsedEventHandler PerformEvent;
链接的事件。这样,如果时间过了,它就会触发,或者我可以自己调用它:
this.m_timer.Elapsed += this.PerformEvent;
我正在尝试创建一个调用它的公共方式,不能创建一个ElapsedEventArgs。
public void FireEvent()
{
object o = new object();
this.PerformEvent.Invoke(o, objectIWantToBeElapsedEventArgs)
}
1: http://referencesource.microsoft.com//服务/定时器/系统/定时器/ElapsedEventArgs.cs fa59a445f56b7851
internal ElapsedEventArgs(int low, int high) {
long fileTime = (long)((((ulong)high) << 32) | (((ulong)low) & 0xffffffff));
this.signalTime = DateTime.FromFileTime(fileTime);
}
如果您需要创建一个新的ElapsedEventArgs,您可以通过使用typemock隔离器调用其内部构造函数来实现,我已经为您的示例创建了一个测试:
[TestMethod, Isolated]
public void InvokeEvent_willChangeWasCalledToTrue()
{
var p = new Program();
bool wasCalled = false;
p.PerformEvent += (s, e) => { wasCalled = true; };
var args = Isolate.NonPublic.CreateInstance<ElapsedEventArgs>(0, 2);
Isolate.Invoke.Event(() => p.PerformEvent += null, null, args);
Assert.IsTrue(wasCalled);
}
你可以在这里读到更多。