C# 在unitTest中托管Web服务
我想使用C# 在unitTest中托管Web服务,c#,.net,wcf,unit-testing,C#,.net,Wcf,Unit Testing,我想使用ServiceHost在单元测试中托管WCF服务 然后在构建机器上运行它们 可以像这样托管web服务吗?如果是,是怎么做的 谢谢我认为这里的问题在于单元测试通常只是由其他框架(NUnit、xUnit等)执行的一组二进制文件 您可以尝试在TestSuite安装程序上启动另一个线程并在该线程上运行WCF,但我相信这种方法涉及的内容更多,测试套件可能也不喜欢它 我要做的是在运行UnitTests之前,在构建机器上设置WCF服务到IIS的部署步骤,或者重新部署到Windows服务承载的WCF。我
ServiceHost
在单元测试中托管WCF服务
然后在构建机器上运行它们
可以像这样托管web服务吗?如果是,是怎么做的
谢谢我认为这里的问题在于单元测试通常只是由其他框架(NUnit、xUnit等)执行的一组二进制文件 您可以尝试在TestSuite安装程序上启动另一个线程并在该线程上运行WCF,但我相信这种方法涉及的内容更多,测试套件可能也不喜欢它
我要做的是在运行UnitTests之前,在构建机器上设置WCF服务到IIS的部署步骤,或者重新部署到Windows服务承载的WCF。我认为这里的问题是UnitTests通常只是由其他框架(NUnit、xUnit等)执行的一组二进制文件 您可以尝试在TestSuite安装程序上启动另一个线程并在该线程上运行WCF,但我相信这种方法涉及的内容更多,测试套件可能也不喜欢它
我要做的是,在运行UnitTests之前,在生成计算机上设置WCF服务到IIS的部署步骤,或重新部署到Windows服务托管的WCF。当然,您只需像使用自托管WCF服务一样使用
ServiceHost
。我通常在测试夹具/类设置/拆卸中执行此操作
例如NUnit:
[TestFixture]
public class MyTests
{
private ServiceHost service;
[TestFixtureSetUp]
public void FixtureSetUp()
{
service = new ServiceHost(typeof(MyService));
service.Open();
}
[Test]
public void ThisIsATest()
{
using (var client = new MyServiceClient())
client.DoStuff(); // test whatever
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
if (service != null)
{
if (service.State == CommunicationState.Opened)
service.Close();
else if (service.State == CommunicationState.Faulted)
service.Abort();
}
}
}
您还需要将任何WCF XML配置复制到测试程序集的app.config中
但是需要注意的是单元测试框架的线程模型。如果您的测试运行程序可以同时运行多个测试类,那么您可能会尝试在同一端口上多次打开同一服务,并且可能会失败
最后一点,我通常会将启动和不启动实际WCF服务的测试分开。将未命中WCF的测试放入一个单独的“单元测试”程序集中,该程序集在没有依赖项的情况下运行且运行速度很快,并将使用WCF的测试放入一个“集成测试”程序集中。当然,这只是一个建议,而不是一个规则。当然,您只需像使用自托管wcf服务一样使用
ServiceHost
。我通常在测试夹具/类设置/拆卸中执行此操作
例如NUnit:
[TestFixture]
public class MyTests
{
private ServiceHost service;
[TestFixtureSetUp]
public void FixtureSetUp()
{
service = new ServiceHost(typeof(MyService));
service.Open();
}
[Test]
public void ThisIsATest()
{
using (var client = new MyServiceClient())
client.DoStuff(); // test whatever
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
if (service != null)
{
if (service.State == CommunicationState.Opened)
service.Close();
else if (service.State == CommunicationState.Faulted)
service.Abort();
}
}
}
您还需要将任何WCF XML配置复制到测试程序集的app.config中
但是需要注意的是单元测试框架的线程模型。如果您的测试运行程序可以同时运行多个测试类,那么您可能会尝试在同一端口上多次打开同一服务,并且可能会失败
最后一点,我通常会将启动和不启动实际WCF服务的测试分开。将未命中WCF的测试放入一个单独的“单元测试”程序集中,该程序集在没有依赖项的情况下运行且运行速度很快,并将使用WCF的测试放入一个“集成测试”程序集中。这当然只是一个建议,而不是规则。这确实是可能的,实际上与在控制台应用程序中托管WCf服务相同! 将app.config添加到UT程序集并一如既往地继续。 (当然,您也可以通过编程方式进行配置)。 类似地,您可以在代码中为主机创建一个客户机 在setup方法上实例化并打开主机和客户机,您可以在每个测试或每个类中执行此操作,具体取决于您所寻求的隔离级别 因此,您不必有单独的部署阶段 说到以上,我实际上不鼓励您在单元测试中使用服务。关于单元测试的最佳实践之一是,它们应该运行得非常快。在UT中,调用web服务(甚至本地)的成本非常高
此外,这种类型与单元测试的语义相矛盾。您应该测试少量的功能。并努力模拟外部依赖,例如数据库访问、外部服务甚至其他类。如果您愿意,我很乐意详细说明并参考更多信息。这确实是可能的,实际上与在控制台应用程序中托管WCf服务相同! 将app.config添加到UT程序集并一如既往地继续。 (当然,您也可以通过编程方式进行配置)。 类似地,您可以在代码中为主机创建一个客户机 在setup方法上实例化并打开主机和客户机,您可以在每个测试或每个类中执行此操作,具体取决于您所寻求的隔离级别 因此,您不必有单独的部署阶段 说到以上,我实际上不鼓励您在单元测试中使用服务。关于单元测试的最佳实践之一是,它们应该运行得非常快。在UT中,调用web服务(甚至本地)的成本非常高 此外,这种类型与单元测试的语义相矛盾。您应该测试少量的功能。并努力模拟外部依赖,例如数据库访问、外部服务甚至其他类。如果您愿意,我很乐意详细说明并参考更多信息