2016-06-27 4 views
1

私は唯一のコンストラクタは、(1から得て)内部にあるので、私は有効なクラスを作ることができないんだけどSystem.Timers.ElapsedEventArgsを継承しようと継承が容易

のテストユニットを作るために

ユニットテストのためにTimerの経過イベントを呼び出すときに、私が派生しているクラスのインスタンスを作成し、それを引数として渡すことができるため、これを実行したいと思います。

テストの手助けとして、パブリックメソッドを使用して呼び出すことのできるクラスのプロパティとして、異なるイベントを使用してインダイレクションのレイヤーを作成しました。私はこれが現在のことを行う正しい方法ではないことを知っていますが、私はテストを働かせたいと思っています。私はシステムクロック/タイマーの代わりになる方法を見つけ出すつもりです。

財産などの新イベント:

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:あなたはその内部のコンストラクタを呼び出すためにtypemockアイソレータを使用することによってそれを行うことができ、新たなElapsedEventArgsを作成する必要がある場合http://referencesource.microsoft.com/#System/services/timers/system/timers/ElapsedEventArgs.cs,fa59a445f56b7851

internal ElapsedEventArgs(int low, int high) {   
     long fileTime = (long)((((ulong)high) << 32) | (((ulong)low) & 0xffffffff)); 
     this.signalTime = DateTime.FromFileTime(fileTime);       
    } 

答えて

0

、私はあなたの例のテストを作成しました:

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

hereで詳しく読むことができます。