4

ファイルとして公開されている WCF サービスの単体テストを計画してい.svcます。それらを単体テストするために利用できるベストプラクティスは何ですか。

私が知っている限り、これは利用可能なオプションです:

別のプロジェクトを作成し、.svc ファイル用にプロキシ クラスを作成してプロジェクトに追加し、それらのプロキシ クラスで単体テストを実行します。プロキシ クラスは、以下を使用して作成できます。

  1. svcutil.exe
  2. Visual Studio の「サービス参照の追加」オプション。

.svcnunit を使用して wcf ファイルを単体テストするために利用できる他の最適なオプションはありますか?

4

3 に答える 3

3

基本的に、サービスの単体テストは行いません。コードがサービスに含まれていないかのように、コードを単体テストします。

サービス クラスのインスタンスを作成しないでください。これは、単体テストするには大きすぎます。そのクラスのコードを単体テストします。単体テストは、サービス全体ではなく、コードの可能な限り最小の単位をテストすることを意図していることに注意してください。

于 2012-11-02T07:39:43.873 に答える
2

サービスの背後にあるロジックをテストする必要がある場合は、以下に示すような単純な単体テストを作成できます。

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}
//Tests
[TestFixture]
public class MyService_Test
{
    [Test]
    public void GetData_should_return_entered_string()
    {
        Service1 service = new Service1();
        Assert.AreEqual("You entered: 1", service.GetData(1));
    }
}

また、統合全体をテストしたい場合は、次の統合テストを作成できます。簡単に言うと、サービスを自己ホストとして実行し、_proxy を使用してサービス メソッドを実行する必要があります。このようなテストは、カスタム メッセージ インスペクター、エラー ハンドラーなどの拡張ポイントをテストする必要がある場合に役立ちます。

    private ITestService _proxy;
    private ServiceHost _host;

    [SetUp]
    public void Initialize()
    {
        const string baseAddress = "net.pipe://localhost/TestService";
        _host = new ServiceHost(typeof(TestService), new Uri(baseAddress));

        var factory = new ChannelFactory<ITestService>(new NetNamedPipeBinding(),
                                                       new EndpointAddress(baseAddress));
        _host.Open();
        _proxy = factory.CreateChannel();
    }

リンク:

統合テスト WCF サービス

于 2012-11-02T07:31:41.960 に答える
1

サービスのロジックをテストするだけの場合は、ロジックを実装するクラスをインスタンス化し、そのメソッドを呼び出すだけです。これは本質的に WCF をバイパスします。これは、Microsoft のコードをテストする理由がないため、単体テストに適しています。一方、統合テストは別の問題です。

于 2012-11-02T07:30:34.237 に答える