TIdHTTPServer поднять ошибку EThread 6 при ее активации в моем тесте DUnit - PullRequest
2 голосов
/ 28 февраля 2012

Мне нужен локальный 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?

  • Delphi 2010
  • Инди 10

Исключение было сгенерировано где-то после этой строки в TIdListenerThread.Run proc (единица IdCustomTCPServer)

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

Однако я не могу проследить это глубже, я не знаю почему.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Возможно, вам потребуется разрешить исполняемому файлу DUnit открыть порт в настройках брандмауэра ... Панель управления> Брандмауэр Windows> Расширенные настройки> Правила для входящих подключений.

Обычно Windows запрашивает у вас первый раз, когда исполняемый файл пытается открыть порт, но я бы все равно проверил, есть ли там правило.

Edit:

Просто добавьте немного больше информации, ошибка «Дескриптор не действителен» выглядит как ошибка 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 голос
/ 01 марта 2012

решаемая. У меня есть свой собственный DPK с компонентами собственной разработки (использованный в этом модульном тесте), и был 1 модуль со ссылками на Indy. После того, как я перестроил этот пакет, компилятор предложил мне добавить несколько новых DCCReference в компоненты Indy. После того, как я переустановил свой пакет, эта ошибка в модульном тесте исчезла.

Я не могу представить причинно-следственные связи, но теперь все в порядке.

...