2009-07-07 12 views
2

私は、イベントを含むコードの単体テストを作成しようとしています。私は意欲的にイベントを起こす必要があるので、私はRhinoMocksに頼りにして、イベントの結果が期待どおりであることを確認しました(ボタンをクリックすると、この例では、予測可能な方法でオブジェクトの高さを下げる必要があります)NUnitで録音する代わりにRhino Mockを呼び出す

私は少しの研究を行い、問題のイベントにはイベントライザーが必要です。それから、eventraiser.Raise()と呼ぶほど簡単です。私たちは良いです。

(多かれ少なかれ直線ネットオフコピー)私は(C#で書かれた)は以下のように書いたイベントライザ

  using (mocks.Record()) 
     { 
      MyControl testing = mocks.DynamicMock<MyControl>(); 
      testing.Controls.Find("MainLabel",false)[0].Click += null; 
      LastCall.IgnoreArguments(); 
      LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull()); 
      Raiser1 = LastCall.GetEventRaiser(); 
     } 

私はその後、再生モードのようにテストを取得するためのコード。

  using (mocks.Playback()) 
     { 
      MyControl thingy = new MyControl(); 
      int temp=thingy.Size.Height; 
      Raiser1.Raise(); 
      Assert.Greater(temp, thingy.Size.Height); 
     } 

問題は、これらのテストをNUnitで実行すると失敗することです。これは、行testing.Controls.Find( "MainLabel"、false)[0] .Click + = null;で例外をスローします。イベントリスナーにnullを追加しようとすると文句を言う。具体的には、 "System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません"

ここで、Mocks.Record見出しの下にあるコードは実際には呼び出されず、再生中のコードコールしかし、これは私がこのような問題を抱えていた2番目の例です(最初の問題はクラス/ケースが関わっています)。NUnitでは、コードが実際には期待を作成するのではなく普通に呼び出されます。誰かが私が間違っていることを指摘できるかどうか不思議です。あるいは、コアの問題を解決する別の方法です。

答えて

3

わかりませんが、MyControlでイベントを仮想化していない場合は、その動作が発生する可能性があります。メソッド、イベント、またはプロパティが仮想でない場合、DynamicMockはその動作を録音と再生のバージョンに置き換えることはできません。

個人的には、私が模倣してインターフェイスをモックしようとしているクラスのインターフェイスを定義するのが好きです。そうすれば、私はこの種の問題を避けることができます。

+0

これは答えのように聞こえます。上記の構文は、私には大丈夫です... – jpoh

+0

はい。それが問題になります。とにかくそれを回避してイベントを起こす方法は新しい問題ですが、私はその部分を理解していきます。 – Kurisu

関連する問題