2012-02-22 8 views
1

で、送信者のオブジェクトがそうのように、私はEventHandlerのを考えてみましょう:ユニットテストのEventHandler

public SomethingHappended_Handler(object sender, EventArgs e) 
{ 
    var myobj = sender as MyClass(); 
    myobj.DoSomethingImportant(); 
} 

がどのように私はこのmyobjは、MyClassののタイプであることをテストすることができますか?私は、送信者が常にMyClassののものであろうことを知っているが、私はちょうど私が必要となる安全であると考えた:

if (myObj != null) //Close it 

タイプがMyClassのない場合、このmyobjはnullになります。私がnullでないことをテストするために最善を知っているように、私がMyClass以外の送信者と異なるタイプを送信した場合、DoSomethingImportantを呼び出すことになるので、ヌルチェックが必要なことを証明する単体テストを作成する方法はありますか?

+1

(myobj == null)... – Lloyd

+0

@Lloydまだメソッドを呼び出すことができるように送信者をキャストする必要があります – Jon

+1

基本的にはテストを表示するように要求していますあなたがしなければならないことをしているかどうかを問わず - IMHOあなたは、C#が文書化されているように動作するかどうかのレベルで "単体テスト"する必要はありません。 'as'は、キャストしようとしているオブジェクトがそのクラスまたはそのクラスのサブタイプでない限り、単にキャストしません。あなたが本当にしたいのであれば、 'as'を使って安全にキャストするもう1つのコードを書くか、 'is'キーワードを使って直接型をテストしてください。または、イベントハンドラはクラス内の単なるメソッドであり、任意のクラスと同じようにテストを記述します。 –

答えて

4

あなたのできることを指摘するために擬似コードでお答えします。

まず、送信者の種類がMyClassであるかどうかを確認できます。

if(sender is MyClass) 

は、その後、あなたのunittestの中に次の2つのモックオブジェクト、MyClass型の1と別のタイプの「MyClassFake」の一つに送信することができます。インターフェイスを使用して、Close()メソッドを実装するようにします。

  1. 検証MyClass.Close()が呼び出されていること:

    は、二つのユニットテストを行います。

  2. MyClassFake.Close()が呼び出されないことを検証します。

Close()は単なる例です。他のメソッドがある場合は、呼び出されたかどうかを呼び出すことができます。