1

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

然后我说等等,你怎么能在 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?

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

现在,我为 Service1 类创建了一些单元测试,以实现 GetData 功能。通过这些测试,您也将通过验收测试。而已。您首先进行了测试,您的 WCF 服务已完全可以托管。

于 2013-10-25T16:05:36.103 回答