を使用して単体テスト内で WCF サービスをホストしたいServiceHost
。
そして、それらをビルド マシンで実行します。
このような Web サービスをホストすることは可能ですか? はいの場合、どのように行われますか?
ありがとう
を使用して単体テスト内で WCF サービスをホストしたいServiceHost
。
そして、それらをビルド マシンで実行します。
このような Web サービスをホストすることは可能ですか? はいの場合、どのように行われますか?
ありがとう
もちろん、ServiceHost
自己ホスト型の wcf サービスの場合と同じように を使用するだけです。通常、これはテスト フィクスチャ/クラスのセットアップ/ティアダウンで行います。
たとえば、NUnit の場合:
[TestFixture]
public class MyTests
{
private ServiceHost service;
[TestFixtureSetUp]
public void FixtureSetUp()
{
service = new ServiceHost(typeof(MyService));
service.Open();
}
[Test]
public void ThisIsATest()
{
using (var client = new MyServiceClient())
client.DoStuff(); // test whatever
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
if (service != null)
{
if (service.State == CommunicationState.Opened)
service.Close();
else if (service.State == CommunicationState.Faulted)
service.Abort();
}
}
}
また、WCF XML 構成をテスト アセンブリの app.config にコピーする必要もあります。
ただし、単体テスト フレームワークのスレッド モデルには注意が必要です。テスト ランナーが複数のテスト クラスを同時に実行できる場合、同じポートで同じサービスを複数回開こうとすると、失敗する可能性があります。
最後に、通常、実際の WCF サービスを起動するテストと起動しないテストを分けます。WCF にヒットしないテストを別の "単体テスト" アセンブリに入れ、依存関係なく実行され、高速に実行し、代わりに WCF を使用するテストを "統合テスト" アセンブリに入れます。もちろん、これは単なる推奨事項であり、規則ではありません。
それは確かに可能であり、実際には、コンソール アプリケーションで WCF サービスをホストするのと同じです! app.config を UT アセンブリに追加し、通常どおり続行します。(もちろん、プログラムで構成することもできます)。同様に、コードでホストのクライアントを作成します。
セットアップ メソッドでホストとクライアントをインスタンス化して開きます。求める分離のレベルに応じて、テストごとまたはクラスごとにこれを行うことができます。
ご覧のとおり、個別のデプロイ ステージを用意する必要はありません。
上記のすべてを述べたので、ユニットテストでサービスを操作することは実際にはお勧めしません。単体テストに関するベスト プラクティスの 1 つは、単体テストを非常に高速に実行することです。UT では、Web サービス (ローカルであっても) への呼び出しは非常にコストがかかります。
さらに、この種のことは、 UNITテストのセマンティクスと矛盾します。小さな機能をテストする必要があります。また、データベース アクセス、外部サービス、その他のクラスなど、外部の依存関係を模倣するように努めます。もしよろしければ、詳しくご説明し、より多くの情報を参照していただければ幸いです。
ここでの問題は、通常、UnitTests が他のフレームワーク (NUnit、xUnit など) によって実行される一連のバイナリに過ぎないことだと思います。
TestSuite セットアップで別のスレッドを開始し、そのスレッドで WCF を実行することもできますが、このアプローチにはもっと関与していると思いますし、テスト スイートも同様に気に入らないかもしれません。
UnitTests を実行する前に、WCF サービスのビルド マシンで IIS への展開手順をセットアップするか、WCF をホストする Windows サービスへの再展開をセットアップします。