2011-02-07 19 views
0

非常に似た機能を持ついくつかの異なるクラスをテストする必要があります。RhinoMocks Mockの一般的な作成

それらの全ては、異なるインターフェースを注射し、そしてすべてのこれらのインタフェースは、このシグネチャを持つ1つ以上の方法有する:

ストリングDoSomething1(文字列)。

テスト対象のクラスの多くはこれらのインターフェイスメソッドを呼び出すため、null、空の文字列を返し、例外をスローする方法をテストする必要があります。私。それだけで一つのクラスだった場合、私はこのテストを持っているでしょう:

//arrange 
     CarComponentType carNull = new CarComponentType(); 
     carNull.VendorCode = RESPONSE_NULL_CODE; 

     CarComponentType carEmpty = new CarComponentType(); 
     carEmpty.VendorCode = RESPONSE_EMPTY_CODE; 

     CarComponentType carEx = new CarComponentType(); 
     carEx.VendorCode = RESPONSE_EXCEPTION; 

     ICarDBCorrector dbCar = MockRepository.GenerateMock<ICarDBCorrector>(); 
     dbCar 
      .Stub(d => d.GetCarVendorByCode(RESPONSE_NULL_CODE)) 
      .Return(null); 
     dbCar 
      .Stub(d => d.GetCarVendorByCode(RESPONSE_EMPTY_CODE)) 
      .Return(String.Empty); 
     dbCar 
      .Stub(d => dbCar.GetCarVendorByCode(RESPONSE_EXCEPTION)) 
      .Throw(new Exception()); 


     CarComponentCorrector corrector = new CarComponentCorrector(dbCar); 

     //act 
     corrector.CorrectComponent(carNull); 
     corrector.CorrectComponent(carEmpty); 
     corrector.CorrectComponent(carEx); 

     //assert 
     Assert.AreEqual(RESPONSE_NULL_CODE, carNull.VendorName); 
     Assert.AreEqual(RESPONSE_EMPTY_CODE, carEmpty.VendorName); 
     Assert.AreEqual(RESPONSE_EXCEPTION, carEx.VendorName); 

は今、私はICarDBCorrectorで2つの以上のそのような方法を持っている、と私は、テストコードを複製しないことを好むだろう。

また、類似のIDbXXXインターフェイスを使用してジョブを実行するその他のComponentCorrectorクラスはほとんどありません。

私はいくつかのジェネリックメソッドを作成することを考えていましたが、これは正しくスタブされたモックを返すことができますが、どのようにこれを行うのか正確には分かりません。

I.e.私は次のようなものを持っています:

T PrepareNullEmptyThrowCorrector<T>(Action<T> action) 
    { 
     T mock = MockRepository.GenerateMock<T>(); 

     mock.Stub(with null).Return(null) 
     ///etc. 

     return mock; 
    } 

どのようにこのアプローチになりますか?

おかげ

UPDATE:は、私は私の問題のいくつかの解決策を見つけました。しかし、より科学的な答えを得るためには、私が最初に意図したように、ジェネリックメソッドの解決策を用いることを好むでしょう。ちょっと興味があるんだけど。私は私の答えから "受け入れられた答え"のマークを、他の興味深い解決策を提供する他のものに変更します。

答えて

0

私はこれを理解することができませんでしたが、すべてのテストクラスの基本クラスを作成し、この基本クラスに入力に基づいて適切なものを返すメソッドを配置することで回避しました。

はその後、自分自身、代わりに値をretunrするスタブを使用してのテストで、私はこの好きですか()を使用:

基本テストクラス:

protected string TestWithNullEmptyException(string code) 
    { 
     switch (code) 
     { 
      case REQ_NULL_CODE: 
       return null; 
       break; 
      case REQ_EMPTY_CODE: 
       return String.Empty; 
       break; 
      case REQ_EXCEPTION: 
       throw new Exception("Exception code recieved."); 
       break; 
      default: 
       return "UNDEFINED"; 
       break; 
     } 
    } 

やテスト中:

dbCar 
    .Stub(d => d.GetAirVendorNameByCode(Arg<string>.Is.Anything)) 
    .Do((Func<string, string>)TestWithNullEmptyException); 

このように、各テストケースで繰り返す必要があるのは「スタブ」だけですが、とにかくそれを行う必要があります。

関連する問題