单元测试中断/断言锁定WCF服务?

时间:2010-08-30 21:31:05

标签: wcf unit-testing entity-framework-4

我正在尝试编写一些单元测试(实际上是更多集成测试)来命中托管我的WCF服务的实时IIS服务器。每当我运行测试时,如果我的一个Assert语句在客户端失败,我的WCF服务似乎锁定了 - 我必须做一个iisreset来重新上线。

例如,我在测试方法中有3个从我的服务客户端调用到WCF服务 - Call1,Call2和Call3。第一次,Call1工作得很好,Call2工作得很好,然后Call3激活Assert,因为有些数据不正确。在下一次测试中,Call1失败并出现以下错误:

“mscorlib.dll中发生了'System.ServiceModel.CommunicationException'类型的异常,但未在用户代码中处理

其他信息:收到http://localhost/Kiosk/KioskSite.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。“

做完iisreset后,一切都还好。

任何人都有任何想法可能会发生什么?

2 个答案:

答案 0 :(得分:1)

如果您必须重新启动IIS,那么您的服务中的状态管理似乎就会出现问题。您的测试是一次成功的测试,因为它暴露了这个问题 - 一个行为不端的客户端可以冻结服务。

我可以建议您在调查中尝试三件事:

1)为您的服务创建一个控制台主机,看看问题是否仍然存在。这将确定它是否是IIS问题。

2)使用服务行为更改服务的并发模式。

   [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)]
   class MyServiceImplementation : IMyService
   {
      // ...
   }

3)确保您在创建的任何代理上调用Close,即使测试失败也是如此。服务一次只能连接有限数量的代理。 (默认值为10)

[Test]
void ATestMethod()
{
     MyService proxyInstance = new MyService();
     try
     {
           Assert.IsTrue(proxyInstance.MethodC());
     }
     finally
     {
          proxyInstance.Close();
     }
}

答案 1 :(得分:0)

这些听起来不像单元测试。单元测试隔离了代码片段并单独测试它们,听起来你正在编写集成测试。

为什么你要测试WCF调用你不能单独测试服务器端方法而不用担心WCF?