2010-12-14 10 views
0

Unitestsingのヘルプが必要です。 (TypeMockがないものとします)このコードをどうやって統一しますか?

EndpointAddress、DiscoveryEndpoint、DiscoveryClientの代わりにモックを挿入するにはコードを変更しますか?

あなたはどのようなテストを書いていますか?私はあなたの助けのいずれかに感謝

GetService_ServiceExist_ResultShouldBeAnInstanceの

GetService_ServiceIsNotExist_ResultShouldNull

static public T GetService<T>(Binding binding, string address) 
    { 
     Contract.Requires(binding != null); 
     Contract.Requires(!string.IsNullOrWhiteSpace(address)); 

     var endpointAddress= new EndpointAddress(address); 
     var discoveryEndpoint = new DiscoveryEndpoint(binding, endpointAddress); 

     var discoveryClient = new DiscoveryClient(discoveryEndpoint); 

     try 
     { 
      // Find ICalculatorService endpoints    
      FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(T))); 

      Contract.Assume(findResponse != null); 
      Contract.Assume(findResponse.Endpoints != null); 


      // Check to see if endpoints were found, if so then invoke the service.);); 
      if (findResponse.Endpoints.Count > 0) 
      { 
       Contract.Assume(findResponse.Endpoints[0] != null); 

       return ChannelFactory<T>.CreateChannel(new BasicHttpBinding(), 
                    findResponse.Endpoints[0].Address); 
      } 
     } 
     catch (TargetInvocationException ex) 
     { 
      Console.WriteLine("This client was unable to connect to and query the proxy. Ensure that the proxy is up and running: " + ex); 
     } 
     return default(T); 
    } 

を考えることができます。 ありがとう!

アリエル

答えて

1

あなたはあなたの方法でEndpointAddress、DiscoveryEndpointとDiscoveryClientへの依存性を持っています。

まず、このコードを工場に似たものに置きます。私はまた、上記の依存関係を必要に応じて工場に入れてから、 IOCを使ってそれらの工場をクラスに注入します。

それで、私はユニットテストのために偽のオブジェクト(またはモック)をシステムに入れさせるので、具体的な検出クライアント(たとえば)に頼る必要はありません。しかしそれが問題でなければ、私はまだそれを工場にしています。

また、エンドポイントを見つけてその上にチャネルを作成したり、例外をスローすることも検討しています。あなたが上記に従っていれば、あなたはデフォルト(T)を返す必要がありますか?

ここで選択するのは、コードをそこに保持し、nullを返す代わりに例外をスローすることです。nullを返してテストします。このメソッドは、コンフィグレーションに基づいてチャネルを作成しようとすることを1つだけ行います。 DiscoveryClient。

これらの依存関係をすべて削除し、それを工場(および必要に応じて工場から他のもの)にして、構成済みのDiscoveryClientを渡してnullを返すか、NullChannelインスタンスを返します。

次に、テストで返されたインスタンスに対してアサーションを実行することができ、作成メソッドには1つの責任しかありません。

HTH

+0

ここでの依存関係はAPIを汚染するとは思われませんか? – ArielBH

+0

真実にはありません。あなたのシステムの他のコンポーネントに依存しているコード。それで、コンストラクターを介してそれらを渡すことによって、その依存関係を明示的に表現してみませんか?それ以外の場合は手動で作成することもできますが、その場合でも工場を使って作業することを検討します。あなたが本当にあなたがIOCを使う必要はありませんが、何か複雑なものを扱っているなら、私はそれを使うでしょう。 – Simon

+0

Simon、ありがとう。今すぐリファクタリング。私は静的APIから戻ってきます...(私はIoCコンテナを使用しています...) – ArielBH

関連する問題