Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在unitTest中托管Web服务_C#_.net_Wcf_Unit Testing - Fatal编程技术网

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服务(甚至本地)的成本非常高

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