在unitTest中托管webservice

时间:2012-08-24 16:27:45

标签: c# .net wcf unit-testing

我想使用ServiceHost在单元测试中托管WCF服务。

然后在构建计算机上运行它们。

是否可以托管此类网络服务?如果是的话怎么做?

由于

3 个答案:

答案 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。