Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/38.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
Asp.net 针对测试数据库集成测试web服务_Asp.net_Wcf_Linq_Unit Testing_Linq To Sql - Fatal编程技术网

Asp.net 针对测试数据库集成测试web服务

Asp.net 针对测试数据库集成测试web服务,asp.net,wcf,linq,unit-testing,linq-to-sql,Asp.net,Wcf,Linq,Unit Testing,Linq To Sql,我目前正在构建一个.net web应用程序,它使用WCF web服务允许Flex前端访问数据库 我正在web服务上设置一些单元/集成风格的测试,并试图找出允许测试访问和修改单独测试数据库中数据的最佳方法 目前,单元测试项目中的连接字符串指向测试数据库,web服务项目中的连接字符串指向开发数据库。然而,当我使用Linq时,当我从测试类调用web服务方法时,它似乎使用了开发数据库连接字符串 我曾研究过创建模拟对象或内存数据库,但我相信同样的问题也会发生 有没有办法让它发挥作用,或者我关于我想要什么的

我目前正在构建一个.net web应用程序,它使用WCF web服务允许Flex前端访问数据库

我正在web服务上设置一些单元/集成风格的测试,并试图找出允许测试访问和修改单独测试数据库中数据的最佳方法

目前,单元测试项目中的连接字符串指向测试数据库,web服务项目中的连接字符串指向开发数据库。然而,当我使用Linq时,当我从测试类调用web服务方法时,它似乎使用了开发数据库连接字符串

我曾研究过创建模拟对象或内存数据库,但我相信同样的问题也会发生


有没有办法让它发挥作用,或者我关于我想要什么的全部想法都不正确,在这种情况下,有没有更好的方法来设置它?我在项目中的时间还早,因此我不反对对解决方案的体系结构进行重大更改。

确保web服务中的代码是最少的,而不仅仅是对服务层的简单调用。当您这样做时,您可以跳过直接调用web服务,并创建一个也调用您的服务层的集成测试套件。在这种情况下,您正在进行进程内呼叫,而不是通过网络进行呼叫。在这种情况下,确保访问正确的数据库会容易得多,并且您可以轻松地用将回滚的数据库事务包装这些调用。您当然希望将任何操作回滚到数据库,因为这将很难维护。一种方法是使用内部测试


祝你好运。

史蒂文的建议是在测试中取消WCF管道。这当然可以工作并测试大部分业务逻辑,但我希望我的自动化集成测试也可以测试WCF交互

我已经在我的项目的自动化测试中成功地实现了这一点

请注意,WCF客户端和WCF主机可以共享同一进程。在这种情况下,它仍在通过WCF框架进行调用,同时存在所有的限制和复杂性。您的WCF服务将从测试项目的配置文件中获取连接字符串

为了说明这一点,下面是在客户机和服务处于同一进程中时配置文件的外观

<configuration>
  <connectionStrings>
    <add name="ContractsManager" 
         providerName="System.Data.SqlClient" 
         connectionString="Data Source=localhost;Initial Catalog=ContractsManager_AutoTest;Integrated Security=True;Pooling=False;Asynchronous Processing=true;Application Name=CmAutoTests"
         />
  </connectionStrings>
    <system.serviceModel>

        <client>
            <endpoint
                name="LoggingService"
                address="net.tcp://localhost:9612/loggingService"
                binding="netTcpBinding"
                contract="ContractsManager.ILoginService" />
        </client>
        <services>
            <service name="ContractsManager.LoginServiceImpl">
                <endpoint
                    address="net.tcp://localhost:9612/loggingService"
                    binding="netTcpBinding"
                    contract="ContractsManager.ILoginService">
                </endpoint>
            </service>
        </services>
    </system.serviceModel>
</configuration>

通过这种方式,您的自动化测试将发现特定于WCF的bug(例如,抛出一个故障契约未指定的异常)。 今天我的代码有一个bug,这意味着频道没有被正确关闭。我的测试一直挂起,因为达到了节流极限。花了一些时间才弄明白,但我很庆幸这个bug没有进入生产

您的测试套件应该在运行第一个测试之前设置服务主机。(我曾尝试在每次测试中设置和拆除服务主机,但运行速度太慢)


祝你好运。

由于WCF web服务类没有绑定到ASP.Net基础结构(不必从Syste.web.Services.WebService继承),因此可以轻松地将对存储库或对象上下文的引用插入到服务中。然后,您可以使用单元测试来测试web服务本身中的任何逻辑,单元测试将使用一些内存中的模拟存储库,然后快速运行。另一方面,集成测试将使用一些真实的数据库,您可以捕获与持久层相关的错误。因此,我不同意Steven的观点,即web服务方法应该是调用某个服务层的单行方法,除非逻辑太重,应该有自己的类。

我决定使用TransactionScope将调用保留在流程中,而不是保存到数据库中。这似乎也会减少运行测试所需的时间。