2011-01-07 8 views
3

私は、次のようなクラスを持っている:C#:同じクラス内の別のメソッドに依存するメソッドを単体テストする方法は?

public class MyProxy : ClientBase<IService>, IService 
{ 
    public MyProxy(String endpointConfiguration) : 
     base(endpointConfiguration) { } 

    public int DoSomething(int x) 
    { 
     int result = DoSomethingToX(x); //This passes unit testing 

     int result2 = ((IService)this).DoWork(x) 

     //do I have to extract this part into a separate method just 
     //to test it even though it's only a couple of lines? 
     //Do something on result2 
     int result3 = result2 ... 

     return result3; 
    } 

    int IService.DoWork(int x) 
    { 
     return base.Channel.DoWork(x); 
    } 
} 
問題がテストしたときに、私は別々に結果2を使用してresult3を取得する部分を抽出することなく結果2アイテムを模擬する方法がわからないということである

方法。そして、単体テストであるため、result2が戻ってくるかどうかをテストするためには深く進んでいきたいと思っています...私はむしろデータを何とか模倣したいのですが...関数を呼び出して置き換えることができます1回の呼び出し。

答えて

1

は次の操作を行います。そして、あなたが行うことができます

public IService MyService { get; set; }

int result2 = MyService.DoWork(x)を限り、どこかのコンストラクタまたはあなたがMyService = this;

を設定するものは何でものようなIServiceプロパティを設定し

プロパティを公開しない場合は、非公開にしたり、アクセサを使用してテストしたりできます。

+0

これはうまくいった!ありがとう!今すぐ清潔でプライベートにしましょう。 – michael

2

あなたは本当にそれを行うことはできません。あなたは3つの選択肢があります。

  • サブクラスてMyProxyをしてDoWorkを上書きし、一部はコンパイラ
  • モックにそれが
  • 移動DoWork基底クラスに設定可能であることを必要としますChannelプロパティを、喜ばせるためにいじる必要になります別のクラスに渡して、コンストラクタのチャンネルに渡して、あなたのテストでそれを嘲笑してください。
3

あなたはフレームワークを嫌うのですか?

の機能は、Rhino Mocksにありますようにしてください。

+0

はい、私は部分的なモックがトリックをすると信じています。 –

+0

私は組み込みのMicrosoft Testing Frameworkを利用したいと考えていましたが、それは解決策ではないようです。私は本当にVisual Studio Ultimateが何を超えて何かを避けることを望んでいます。 – michael

+0

私は不思議です、あなたはスタジオに組み込まれているものを超えたものを避けるための理由がありますか?また、どのStudioのバージョンを使用していますか? –

0

あなたは、あなたが

MMyProxy.DoWork32 =() => put your mock result here. 

が落ちるスルーするunmocked方法のためmoleBehaviorを設定することを忘れないでください次の操作を行うことができますが、それが実行して取得したら、最新のMicrosoftの研究プロジェクトMoles

を使用することによってそれを行うことができます。

0

私はここでデザイン上の問題があると考えています。あなたのIService.DoWorkは他のクラスに住んでいるはずです。他のクラスの薄いラッパーのように見えます。リファクタリングを検討しましたか?

他のクラスに住んでいる場合は、モッキングのための特別な処理は必要ありません。

関連する問題