2013-03-01 16 views
24

WCFサービス用のテストクラスを作成したかったのです。私は "嘲笑"がこれの正しい言葉だと信じていますか?WCF Webサービスをテストしますか?

私はこれを行う必要があると思う方法が正しい方法であるとは思わない。私は、たとえば、WCFサービスへのURLを与えられている:

http:://somesite.com/wcf/RealService.svc 

そして:

http:://somesite.com/wcf/RealService.svc?wsdl 

だからではなく、実際にService Referenceとしての私のプロジェクトにRealService.svcを追加するので、私は単に新しい空のWCF Serviceを追加しました私のプロジェクトはService1と呼ばれています。

wsdl.exe(またはおそらくsvcutil.exe?)ツールを使用して、WSDL URL:http:://somesite.com/wcf/RealService.svc?wsdlからインターフェイスを生成します。

Service1.csファイルを開き、IService1.csから継承するのではなく、生成されたinterfaceから継承させます。

私のアプリケーションで実際のサービスを呼び出す代わりに、私は単にService1クラスを呼び出します。 Webサービスを嘲笑するのはどうですか?

また、実際にinterfaceをsvcutilツールで生成する方法を理解する必要があります(私はWCFサービスでwsdl.exeを使用できないことを読んだことがありますか?)。だから、その上の任意のヒントだけでなく、歓迎以上です!触れする

+0

http://www.codeproject.com/Articles/318260/How-to-Mock-a-WCF-Service – Zaki

+0

@ Zaki - 私はその記事がおそらく "WCFサービスを模擬しないでください"と題するべきだと思います – mungflesh

答えて

18

多くの地域では、右方向にあなたを指すようにしようとします:

  • は、Visual StudioのGUIツールを使用して、あなたのWCFサービス(すなわち、出力を確認し、入力を渡す)テストする場合WCF Test Client(MSDN記事here

  • あなたはサービスインタフェース(SO hereスレッド関連)を模擬することができますNMock2のようなモックフレームワークを使用して、あなたのWCFサービスを(すなわち、単位WCFサービスを消費コンポーネントをテスト)モックとしたい場合。外部フレームワークを使用したくない場合は、(インタフェースを実装することによって)モックを手作業でコードすることもできますが、これはより複雑です。

  • WCFサービスをユニットテストする(サービス、ビジネス、データなどのユニットテストを書く)場合は、よく知られているモックフレームワーク(関連するSOスレッドhere)を使用してください。

  • WCFサービスのプロキシを生成するには、推測したとおりにsvcutil.exeコマンドラインユーティリティ(MSDN記事here)を使用します。このユーティリティには、さまざまなオプション(言語、名前空間、設定ファイルなど)が付属しているので、注意してください。

希望します。

+0

サービス参照を追加する以外に、クライアントプロキシを生成する新しいC#プロジェクトがあるとします.Svcutil.exeを使用する場合とそうでない場合の違いは何ですか?なぜそれを使用したいのですが、同じことを正しく行うプロジェクトへの参照を追加するだけですか?またはそうでないかもしれません。私はクライアントプロキシについてWCFでテストするという点でクライアントプロキシについてもっと理解しようとしています – PositiveGuy

+0

@CoffeeAddict - 両方のアプローチ(プロジェクト参照またはsvcutil)は完全に機能します。前者のアプローチでは、Visual Studioはいくつかの「舞台裏での魔法」を行い、たくさんのファイルを生成しますが、これは簡単に更新できます。ただし、後者の方法では、1つのプロキシファイルを処理しますが、更新のためにコマンドを再度実行する必要があります。私は後者を好んでいます。なぜなら私のソースコントロールに1つのプロキシファイルをコミットするのが好きで、コマンドラインで更新プロセスを気にしないからです。意味がありますか? – Channs

3

あなたは(Visula Studioから:サービス参照...を追加)svcutil.exeを使用してプロキシあなたを生成することができます。これにより、クライアントプロキシとサービスインターフェイスが生成されます。あなたのサービスのhttpためexempleについては

:: //somesite.com/wcf/RealService.svc我々が得るのwsdl:?

  • IRealService(インターフェース)
  • RealServiceClient(IRealServiceを実装し、システムを拡張します。 ServiceModel.ClientBase)

サービスインターフェイス(IRealService)を実装するモッククラスを作成できます。

サービスを呼び出すときに具体的なサービスクライアント(RealServiceClient)をインスタンス化するのではなく、アプリケーションでFactoryまたはIOCコンテナを使用できます。

このようにして、アプリケーション(またはモジュール/コンポーネント)がどのインスタンスで動作するかを決めることができます。実行時の実際のサービス、テスト時のモック。

+0

誰かが自分のWCFプロジェクト参照をC#テストプロジェクトに追加するだけで、C#プロジェクトにサービス参照を追加する必要はありません。また、たとえあなたがそれを注入していても、サービスインスタンスをまったく使用しないことを嘲笑するという点はありませんか?それは孤立しているはずなので、偽のフレームワークはあなたのために偽のサービスインスタンスを作成しませんか? – PositiveGuy

+0

**サービス参照の追加... **コマンドを呼び出すと、* regular code *として使用できる生成されたコードが得られます。つまり、**プロキシクラス**が生成されているアセンブリを参照して、**サービス参照の追加...コマンド(例:テストプロジェクトなど)を呼び出す必要なくそれらを使用することができます。 *問題*は、契約( 'interfaces')とその実装(' classes')が同じファイル(つまり同じアセンブリ)で生成されますが、テストプロジェクトで '模擬'の実装を作成することを止めるものはありません。 – polkduran

+0

メインアプリケーションが具体的な実装の代わりに 'interfaces'を処理する限り、*実際の*サービス実装や*模擬*クラスを注入**することができます。たとえば、テストしているときや、 *本物の*サービスを呼び出す(プロトタイプ作成の場合など)。それが*嘲笑*のポイントです。 – polkduran

関連する問題