TIdHTTPServer génère l'erreur EThread 6 lors de son activation dans mon test DUnit
-
13-11-2019 - |
Question
J'ai besoin d'un serveur HTTP local pour mon test unitaire.
Lorsque j'essaie d'activer TIdHTTPServer à SetUp
, il échoue avec le message EThread :
"Erreur de discussion :descripteur non valide (6)"
Voici comment je l'initialise :
type
TestMyUnit = class(TTestCase)
...
procedure TestMyUnit.SetUp;
begin
FServer := TIdHTTPServer.Create(nil);
FServer.OnCommandGet := HTTPServerCommandGet;
FServer.Active := True; // <---- This will cause error
end;
Peut-être existe-t-il certaines restrictions lors de l'utilisation du TIdHTTPServer d'Indy avec le framework DUnit ?
- Delphes 2010
- Indy10
Une exception a été levée quelque part après cette ligne dans TIdListenerThread.Run
proc (unité IdCustomTCPServer)
LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn);
Cependant, je ne peux pas le retrouver plus profondément, je ne sais pas pourquoi.
La solution 2
Résolu.J'ai mon propre DPK avec des composants auto-conçus (utilisés par ce test unitaire), et il y avait 1 unité avec des références à Indy.Après avoir reconstruit ce package, le compilateur m'a proposé d'ajouter une nouvelle DCCReference aux composants Indy.Après avoir réinstallé mon package, cette erreur dans le test unitaire a disparu.
Je ne peux pas imaginer les relations de cause à effet, mais maintenant ça va.
Autres conseils
Vous devrez peut-être autoriser votre exécutable DUnit à ouvrir le port dans la configuration de votre pare-feu...Panneau de configuration > Pare-feu Windows > Paramètres avancés > Règles entrantes.
Habituellement, Windows vous le demandera la première fois que l'exécutable essaie d'ouvrir le port, mais je vérifierais de toute façon qu'il existe une règle.
Modifier:
Ajoutez simplement un peu plus d'informations, l'erreur "Descripteur non valide" ressemble à une erreur Winsock et pourrait être due au fait que votre code ne peut pas ouvrir le port.Cela peut être dû au fait qu'il est bloqué au niveau du pare-feu (comme je l'ai mentionné ci-dessus) ou il se peut que vous ayez un autre programme sur lequel ce port est ouvert...Comme IIS peut-être ?Je choisirais un port supérieur à 1024 quelque part et configurerais votre serveur Web pour qu'il l'utilise (et évidemment votre client).
Modifier 2 :
Mon code pour configurer mon TIdHttpServer est :
FServer := TIdHttpServer.Create(nil);
FServer.DefaultPort := 7777;
FServer.AutoStartSession := True;
FServer.OnCommandGet := ServerCommandGet;
FServer.OnCreatePostStream := ServerCreatePostStream;
FServer.Active := True;