2

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

当我尝试在 处激活 TIdHTTPServer 时SetUp,它会失败并显示 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 框架有一些限制?

  • 德尔福 2010
  • 印地 10

TIdListenerThread.Run在proc(IdCustomTCPServer 单元)的这一行之后的某处引发了异常

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

但是,我无法更深入地追踪它,我不知道为什么。

4

2 回答 2

2

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

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

编辑:

只需添加更多信息,错误“Descriptor not valid”看起来像一个winsock错误,可能是因为您的代码无法打开端口。可能是因为它在防火墙处被阻止(正如我上面的意思),或者可能是您有另一个程序打开了该端口......也许像 IIS?我会在某处选择一个高于 1024 的端口并将您的 Web 服务器设置为使用该端口(显然还有您的客户端)。

编辑2:

我设置 TIdHttpServer 的代码是:

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

FServer.Active := True;
于 2012-02-28T07:24:40.687 回答
1

解决了。我有自己设计的组件(用于此单元测试)的 DPK,并且有 1 个单元引用了 Indy。在我重建了那个包之后,编译器建议我向 Indy 组件添加一些新的 DCCReference。重新安装软件包后,单元测试中的错误消失了。

我无法想象因果关系,但现在可以了。

于 2012-03-01T06:08:10.987 回答