首先对 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 服务创建验收测试开始:
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 服务已完全准备好承载。