从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);                        
    }

从system . timer . elapsedeventargs继承,使单元测试更容易

如果您需要创建一个新的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);
}

你可以在这里读到更多。