在我的DUnit测试中激活时,TIdHTTPServer会引发EThread错误6

时间:2012-02-28 06:43:28

标签: delphi delphi-2010 indy indy10 dunit

我需要一台本地HTTP服务器进行单元测试。

当我尝试在SetUp激活TIdHTTPServer时,它会因EThread消息而失败:

  

“线程错误:描述符无效(6)”

这是我初始化它的方式:

type
  TestMyUnit = class(TTestCase)
...
procedure TestMyUnit.SetUp;
begin
  FServer := TIdHTTPServer.Create(nil);
  FServer.OnCommandGet := HTTPServerCommandGet;
  FServer.Active := True;   // <---- This will cause error
end;

使用Indy的TIdHTTPServer和DUnit框架可能存在一些限制吗?

  • Delphi 2010
  • Indy 10

TIdListenerThread.Run proc(IdCustomTCPServer unit)中的这一行之后的某处抛出了异常

LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn);

然而,我无法追查它,我不知道为什么。

2 个答案:

答案 0 :(得分:2)

您可能必须允许您的DUnit可执行文件在防火墙设置中打开端口...控制面板&gt; Windows防火墙&gt;高级设置&gt;入境规则。

通常Windows会在第一次尝试打开端口时询问您,但我会检查其中是否有规则。

修改

只需添加更多信息,错误“描述符无效”看起来像是一个winsock错误,可能是因为您的代码无法打开端口。可能是因为它在防火墙处被阻止(正如我上面所说的那样),或者可能是你有另一个程序打开了这个端口......也许是IIS?我会在某个地方选择1024以上的端口并设置你的网络服务器(显然是你的客户端)。

编辑2:

我设置TIdHttpServer的代码是:

FServer := TIdHttpServer.Create(nil);
FServer.DefaultPort := 7777;
FServer.AutoStartSession := True;
FServer.OnCommandGet := ServerCommandGet;
FServer.OnCreatePostStream := ServerCreatePostStream;

FServer.Active := True;

答案 1 :(得分:1)

解决。我有自己的DPK和自行设计的组件(由这个单元测试使用),并且有1个单元参考了Indy。在我重建该包之后,编译器建议我向Indy组件添加一些新的DCCReference。重新安装我的软件包后,单元测试中的错误已经消失。

我无法想象因果关系,但现在没关系。