1

そこで、作成したい新しい WCF サービスの TDD テストの作成を開始しました。TDD では、テストを作成し、まだ存在しないオブジェクトをテストに追加し始めます。最初にテストしたかったオブジェクトは、サービスがインスタンス化後に null ではないことでした。

それから私は待って、WCFでどうやってそれを行うことができるのか...サービス拡張は.svcです. はい、.svc.cs がありますが、メインの親は .svc です。このようなものがあるこの部分で TDD を実行する方法がわかりませんが、.cs だけでなく .svc が作成されます。

 [TestMethod]
    public void UponInitialization_ServiceIsNotNull()
    {
        // Arrange
        // Act
        NyNewService service = new MyNewService();

        // Assert
        Assert.IsTrue(service != null);
    }

これは非常に基本的な必要な最初のテストであり、最初から可能な限り単純なものをテストします...これは、TDD を行っている TDD または XP チームでは非常に一般的です。

ここでテスト内から新しい .svc を作成する方法について何か考えはありますか? プレーンな .cs ではありませんか?

4

1 に答える 1

3

存在しない WCF サービスの受け入れテストを作成することから始めます。

private Uri _baseAddress = new Uri("http://localhost:8713/service1");
private IService1 _client;

[SetUp]
public void Setup()
{
    var binding = new BasicHttpBinding();
    var endpoint = new EndpointAddress(_baseAddress);
    var factory = new ChannelFactory<IService1>(binding, endpoint);
    _client = factory.CreateChannel();
}

[TearDown]
public void TearDown()
{
    if (_client != null)
        ((ICommunicationObject)_client).Close();
}

[Test]
public void ShouldReturnSampleData()
{
    Assert.That(_client.GetData(42), Is.EqualTo("You entered: 42"));
}

まだ何も作成されていないことに注意してください。テストから始めます。これで、サービス インターフェイスを作成できます。

public interface IService1
{
    string GetData(int value);
}

テストはコンパイルされるようになりましたが、もちろん、エラーで失敗します

IService1 のコントラクト タイプを取得しようとしましたが、そのタイプは ServiceContract ではなく、ServiceContract を継承していません。

これは、インターフェイスを[ServiceContract]属性でマークする必要があるためです。この属性を追加して、テストを再度実行します。

メソッド GetData はこのプロキシではサポートされていません。これは、メソッドが OperationContractAttribute でマークされていない場合、またはインターフェイス タイプが ServiceContractAttribute でマークされていない場合に発生する可能性があります。

わかりました、必要な属性でサービス インターフェイスをマークします。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

ここで、別のエラーが表示されます (存在しないサービスを実際に実行しているものがないため)。

http://localhost:8713/service1メッセージを受け入れることができるリッスンしているエンドポイントがありませんでした。これは、多くの場合、アドレスまたは SOAP アクションが正しくないことが原因です。詳細については、InnerException (存在する場合) を参照してください。

ServiceHost を使用してサービスを実行できます (現時点では、テストをコンパイルするサービス クラスを作成する必要があります)。

private ServiceHost _host;

[SetUp]
public void Setup()
{
    _host = new ServiceHost(typeof(Service1), _baseAddress);
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    _host.Description.Behaviors.Add(smb);
    _host.Open();

    // creating client as above
}

[TearDown]
public void TearDown()
{
    // closing client as above

    if (_host != null)
        _host.Close();
}

また、サービス クラスごとに IService1 インターフェイスを実装する必要があります (そうしないと、テストは失敗します)。

public class Service1 : IService1
{
    public string GetData(int value)
    {
        throw new NotImplementedException();
    }
}

ここで、GetData 機能を実装するために、Service1 クラスの単体テストをいくつか作成しました。これらのテストに合格すると、受け入れテストにも合格します。それでおしまい。最初にテストを行い、WCF サービスをホストする準備が完全に整いました。

于 2013-10-25T16:05:36.103 に答える