所以我开始为我想要创建的新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?
答案 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服务已完全准备好进行托管。