我需要一台本地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框架可能存在一些限制吗?
在TIdListenerThread.Run
proc(IdCustomTCPServer unit)中的这一行之后的某处抛出了异常
LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn);
然而,我无法追查它,我不知道为什么。
答案 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。重新安装我的软件包后,单元测试中的错误已经消失。
我无法想象因果关系,但现在没关系。