0

我想在单元测试中使用ServiceHost.

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

是否可以托管这样的网络服务?如果是的话,它是怎么做的?

谢谢

4

3 回答 3

3

当然,ServiceHost如果它是自托管的 wcf 服务,您只需像使用它一样使用它。我通常在测试夹具/类设置/拆卸中执行此操作。

以 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 的测试放入“集成测试”程序集中。当然,这只是一个建议,而不是规则。

于 2012-08-24T17:16:26.797 回答
2

这确实是可能的,实际上与在控制台应用程序中托管 WCf 服务相同!将您的 app.config 添加到 UT 程序集并像往常一样继续。(当然,您也可以通过编程方式进行配置)。同样,您在代码中为主机创建客户端。

在设置方法上实例化并打开您的主机和客户端,您可以按测试或按课程执行此操作,具体取决于您寻求的隔离级别。

所以你看,你不必有一个单独的部署阶段。

说了以上所有内容,我实际上不鼓励您在单元测试中使用服务。关于单元测试的最佳实践之一是它们应该运行得非常快。在 UT 中调用 Web 服务(甚至是本地服务)的成本很高。

此外,这与UNIT测试的语义相矛盾。您应该测试一小部分功能。并努力模拟出外部依赖项,例如数据库访问、外部服务甚至其他类。如果您愿意,我很乐意详细说明并参考更多信息。

于 2012-08-24T17:20:29.307 回答
0

我认为这里的问题是 UnitTests 通常只是一组由其他框架(NUnit、xUnit、...)执行的二进制文件。

您可以尝试在 TestSuite 设置上启动另一个线程并在该线程上运行 WCF,但我相信它更多地涉及这种方法,并且测试套件可能也不喜欢它。

我要做的是在你的 WCF 服务的构建机器上设置一个部署步骤到 IIS,或者在运行 UnitTests 之前重新部署到 Windows 服务托管的 WCF。

于 2012-08-24T16:58:14.437 回答