【问题标题】:hosting webservice in unitTest在 unitTest 中托管 Web 服务
【发布时间】:2012-08-24 16:27:45
【问题描述】:

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

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

是否可以托管这样的网络服务?如果是,它是如何完成的?

谢谢

【问题讨论】:

    标签: c# .net wcf unit-testing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          相关资源
          最近更新 更多