0

を使用して単体テスト内で WCF サービスをホストしたいServiceHost

そして、それらをビルド マシンで実行します。

このような Web サービスをホストすることは可能ですか? はいの場合、どのように行われますか?

ありがとう

4

3 に答える 3

3

もちろん、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 を使用するテストを "統合テスト" アセンブリに入れます。もちろん、これは単なる推奨事項であり、規則ではありません。

于 2012-08-24T17:16:26.797 に答える
2

それは確かに可能であり、実際には、コンソール アプリケーションで WCF サービスをホストするのと同じです! app.config を UT アセンブリに追加し、通常どおり続行します。(もちろん、プログラムで構成することもできます)。同様に、コードでホストのクライアントを作成します。

セットアップ メソッドでホストとクライアントをインスタンス化して開きます。求める分離のレベルに応じて、テストごとまたはクラスごとにこれを行うことができます。

ご覧のとおり、個別のデプロイ ステージを用意する必要はありません。

上記のすべてを述べたので、ユニットテストでサービスを操作することは実際にはお勧めしません。単体テストに関するベスト プラクティスの 1 つは、単体テストを非常に高速に実行することです。UT では、Web サービス (ローカルであっても) への呼び出しは非常にコストがかかります。

さらに、この種のことは、 UNITテストのセマンティクスと矛盾します。小さな機能をテストする必要があります。また、データベース アクセス、外部サービス、その他のクラスなど、外部の依存関係を模倣するように努めます。もしよろしければ、詳しくご説明し、より多くの情報を参照していただければ幸いです。

于 2012-08-24T17:20:29.307 に答える
0

ここでの問題は、通常、UnitTests が他のフレームワーク (NUnit、xUnit など) によって実行される一連のバイナリに過ぎないことだと思います。

TestSuite セットアップで別のスレッドを開始し、そのスレッドで WCF を実行することもできますが、このアプローチにはもっと関与していると思いますし、テスト スイートも同様に気に入らないかもしれません。

UnitTests を実行する前に、WCF サービスのビルド マシンで IIS への展開手順をセットアップするか、WCF をホストする Windows サービスへの再展開をセットアップします。

于 2012-08-24T16:58:14.437 に答える