我想使用ServiceHost
在单元测试中托管WCF服务。
然后在构建计算机上运行它们。
是否可以托管此类网络服务?如果是的话怎么做?
由于
答案 0 :(得分:3)
当然,如果它是一个自托管的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的程序放入“集成测试”程序集中。这当然只是一个推荐,而不是一个规则。
答案 1 :(得分:2)
确实可能并且实际上与在控制台应用程序中托管WCf服务相同! 将app.config添加到UT程序集并继续执行。 (当然,您也可以以编程方式配置)。 同样,您可以在代码中为主机创建客户端。
在设置方法上实例化并打开主机和客户端,您可以按照每个测试或每个类执行此操作,具体取决于您寻求的隔离级别。
所以你看,你不必有一个单独的部署阶段。
说完以上所有内容后,我实际上不鼓励你在单元测试中使用服务。关于单元测试的最佳实践之一是它们应该非常快速地运行。在UT中调用Web服务(甚至是本地)是非常昂贵的。
此外,这种与 UNIT 测试的语义相矛盾。你应该测试一些小功能。并努力模拟外部依赖项,如数据库访问,外部服务甚至其他类。如果您愿意,我很乐意详细说明并参考更多信息。
答案 2 :(得分:0)
我认为这里的问题是UnitTests通常只是一组由其他框架(NUnit,xUnit,...)执行的二进制文件。
你可以试试TestSuite设置启动另一个线程并在该线程上运行WCF,但我相信它更多地涉及这种方法,测试套件可能也不喜欢它。
我要做的是在运行UnitTests之前在WCF服务的构建计算机上设置部署步骤或重新部署到Windows服务托管的WCF。