我将从为不存在的 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 服务已完全可以托管。