首先对 WCF 服务类本身进行 TDD

本文关键字:TDD WCF 服务 | 更新日期: 2023-09-27 18:36:50

所以我开始为我想创建的新 WCF 服务创建 TDD 测试。 在 TDD 中,创建测试,并开始将尚不存在的对象添加到测试中。 我想测试的第一个对象是服务在实例化后不为 null。

然后我说等等,你到底怎么能在WCF中做到这一点......服务扩展名为 .svc。 是的,有一个.svc.cs但主要的父级是.svc。 我看不出有什么方法可以在您有这样的东西的这一部分进行 TDD,但它会创建一个 .svc 而不仅仅是一个.cs:

 [TestMethod]
    public void UponInitialization_ServiceIsNotNull()
    {
        // Arrange
        // Act
        NyNewService service = new MyNewService();
        // Assert
        Assert.IsTrue(service != null);
    }

这是一个非常基本的必要第一次测试,从一开始就测试最简单的测试......这在任何做TDD的TDD或XP团队中都很常见。

关于如何从我的测试中创建新的.svc的任何想法? 不是普通的.cs?

首先对 WCF 服务类本身进行 TDD

我将从为不存在的 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]属性标记我们的接口。我们添加此属性并再次运行测试:

此代理不支持方法 GetData,如果 方法未标有 OperationContractAttribute 或如果 接口类型未标有服务合同属性。

好的,用必需的属性标记我们的服务接口:

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

现在我们看到另一个错误(因为实际上没有任何内容在运行我们不存在的服务)

没有

端点侦听http://localhost:8713/service1 可以接受消息。这通常是由不正确的地址引起的 或 SOAP 操作。有关更多详细信息,请参阅 InnerException(如果存在)。

我们可以使用 ServiceHost 来运行我们的服务(此时我们需要创建 service 类来编译测试):

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();
    }
}

现在,我已经为 Service1 类创建了一些单元测试,以实现 GetData 功能。通过这些测试后,您也将通过验收测试。就是这样。您首先进行了测试,并且您的 WCF 服务已完全准备好承载。