2009-09-23 19 views
0

私は次のコードを持っています(簡略化)。Rhino Mock AAAの他のクラスからのメソッド呼び出しを模擬する方法は?

public class OrderProcessor 
{ 
    public virtual string PlaceOrder(string test) 
    { 
     OrderParser orderParser = new OrderParser(); 
     string tester = orderParser.ParseOrder(test); 
     return tester + " here" ; 
    } 

} 

public class OrderParser 
{ 

    public virtual string ParseOrder(string test) 
    { 
     if (!string.IsNullOrEmpty(test.Trim())) 
     { 
      if (test == "Test1") 
       return "Test1"; 
      else 
      { 
       return "Hello"; 
      } 
     } 
     else 
      return null; 
    } 
} 

次のように私のテストがある -

public class OrderTest 
    { 
     public void TestParser() 
     { 
     // Arrange 

     var client = MockRepository.GenerateMock<OrderProcessor>(); 
     var spec = MockRepository.GenerateStub<OrderParser>(); 

     spec.Stub(x => x.ParseOrder("test")).IgnoreArguments().Return("Test1"); 

     //How to pass spec to client so that it uses the same. 

     } 
    } 

を今ではOrderParserから、モックメソッドを使用するように、私はクライアントをテストしますか。 私はOrderParserをモックすることができますが、それをorderProcessorモッククラスにどのように渡すのですか?

お知らせください。

ありがとうございます。

答えて

1

RhinoMocksが動作すること以外は何もテストしていないので、少し混乱してしまいます。あなたは2つのモックを作成し、それらにいくつかのアサーションを行います。あなたは本当のクラスをテストしたことさえありません。

本当に良い単体テストを取得したいのであれば、依存性注入を行う必要があります。インターフェイスを有効にし、依存関係注入を使用してテストを有効にするコードをすばやくリファクタリングできます。あなたのOrderParserクラスからインターフェースを抽出することにより

スタート:

public interface IOrderParser 
{ 
    String ParseOrder(String value); 
} 

今すぐあなたのOrderParserクラスは、そのインタフェースを実装していることを確認します

public class OrderParser: IOrderParser{ ... } 

あなたは今、インスタンスに取るようにあなたのOrderProcessorクラスをリファクタリングすることができますIOrderParserオブジェクトのコンストラクタを使用します。このようにして、依存関係をクラスに「注入」します。

public class OrderProcessor 
{ 
    IOrderParser _orderParser; 

    public OrderProcessor(IOrderParser orderParser) 
    { 
     _orderParser = orderParser; 
    } 

    public virtual string PlaceOrder(string val) 
    { 
     string tester = _orderParser.ParseOrder(val); 
     return tester + " here" ; 
    } 
} 

あなたのテストでは、SUT(Subject Under Test)ではなく依存関係のみを模擬したいと思うだけです。あなたのテストはこのようなものになります。

public class OrderTest 
    { 
     public void TestParser() 
     { 
     // Arrange 

     var spec = MockRepository.GenerateMock<IOrderParser>(); 
     var client = new OrderProcessor(spec); 

     spec.Stub(x => x.ParseOrder("test")).IgnoreArguments().Return("Test1"); 

     //Act 
     var s = client.PlaceOrder("Blah"); 

     //Assert 
     Assert.AreEqual("Test1 Here", s); 

     } 
    } 

を私はあなたのクラスでやろうとしているものを測定することは困難ですが、このことからアイデアを得ることができるはずです。従うべきいくつかの公理:外部依存関係(制御の反転)

  • テストに使用dependency injection
  • 継承上

    1. 使用インタフェースと組成単一ユニット、及びつのみレベルを模擬その依存
    2. を模擬依存関係のあなたはZに依存してYに依存クラスXをテストしている場合は、あなただけのYをからかうべきであると決してZ.
    3. 常にtest behavior、決して実装の詳細

    あなたは正しい軌道に乗っているようだが、少しガイダンスが必要です。私はMartin FowlerBob Martinの速度を上げなければならない資料を読むことをお勧めします。

    関連する問題