首先是TDD WCF服务类本身

时间:2013-10-25 15:06:35

标签: c# wcf unit-testing tdd

所以我开始为我想要创建的新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或XP团队做TDD时非常常见。

关于如何在我的测试中创建新的.svc的任何想法?不是简单的.cs?

1 个答案:

答案 0 :(得分: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服务已完全准备好进行托管。