2012-02-28 63 views
2

我需要一個本地HTTP服務器用於我的單元測試。TIdHTTPServer在我的DUnit測試中激活EThread錯誤6時

當我嘗試在SetUp激活TIdHTTPServer,它失敗ETHREAD消息:

"Thread Error: descriptor not valid (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); 

但是,我找不到它更深某處後拋出,我不知道爲什麼。

+0

我必須問這個...你有沒有嘗試在不同的機器上運行可執行文件? – Nat 2012-02-29 02:09:12

回答

1

解決。我有我自己設計的DPK(由本單元測試使用),並且有1個單元提及Indy。在我重建了這個包之後,編譯器建議我爲Indy組件添加一些新的DCCReference。重新安裝我的軟件包後,單元測試中的錯誤消失了。

我無法想象因果關係,但現在沒關係。

2

您可能必須允許您的DUnit可執行文件在防火牆設置中打開端口...控制面板> Windows防火牆>高級設置>入站規則。

通常windows會問你第一次可執行文件試圖打開端口,但我會檢查那裏是否有規則。

編輯:

只需添加更多的信息,錯誤「描述符無效」看起來像一個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; 
+0

禁用防火牆並將'DefaultPort'設置爲10080後沒有變化 – Andrew 2012-02-28 08:35:32

+1

似乎我發現了這個問題。我有我自己設計的DPK(由本單元測試使用),並且有1個單元提及Indy。在我重建了這個包之後,編譯器建議我爲Indy添加一些新的DCCReference。重新安裝我的軟件包後,該錯誤消失了。你如何看待,我應該添加這個答案或更好地檢查你的答案是否正確?我認爲我的情況不是很常見。 – Andrew 2012-02-29 08:15:06

+0

我會添加一個你自己的解答你解釋你做了什麼,24小時後,接受它:) – Nat 2012-03-01 01:36:45