Als Modul habe ich einen Mojolicious Web Service implementiert , der Datei-Uploads per POST akzeptiert. Ein Beispiel für einen cURL-Befehl:
curl -X POST http://localhost:3000/process -F [email protected]
Dies funktioniert wie erwartet, die Datei wird verarbeitet und das Ergebnis wird zurückgegeben.
Ich versuche es jetzt mit Test::Mojo wie folgt zu testen :
my $t = Test::Mojo->new( 'TK::Proxy' );
my $data = {
inputFile => { filename => 't/file.txt' },
};
$t->post_ok('/process' => form => $data)
->status_is(200)
Der Test schlägt fehl:
$ ./Build test
[...]
# Failed test '200 OK'
# at t/20_app.t line 44.
# got: '400'
# expected: '200'
Das Debuggen des Codes zeigt, dass der hochgeladene Inhalt leer ist.
Ich habe überprüft, ob die Datei gefunden wird, indem ich vor dem Test einen einfachen Druck hinzugefügt habe:
open FILE,'<', 't/file.pdf' or die("Could not read file");
while (my $line = <FILE>) {
print STDERR ($line . "\n");
}
Dies gibt die Datei wie erwartet aus.
Meine Schlussfolgerung ist daher, dass der Fehler im post_ok
Aufruf und/oder in der Struktur von liegt $data
, aber ich konnte nicht herausfinden, wo. Soweit ich das beurteilen kann, sieht der Aufruf genauso aus wie im Beispiel in der Dokumentation .
So wird der Dateiinhalt serverseitig verarbeitet:
my $self = shift()->openapi()->valid_input() or return;
my $input = $self->validation()->output();
my $content;
eval {
my $document = $input->{inputFile}->slurp;
$content = $self->textractor()
->process(
$input->{source},
$input->{target},
$document,
_parse_runtime_params($input->{runtimeParams}),
);
};
Es stellt sich heraus, dass das Ergebnis von $input->{inputFile}->slurp;
ein leerer String für den Test ist. Im cURL-Aufruf enthält es jedoch den Dateiinhalt korrekt.
Die Lösung, wie von @Boroding angegeben, bestand in der Tat darin, zu ersetzen fileName
durch file
:
my $data = {
inputFile => { file => 't/file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);
Dies fehlt vermutlich im Dokumentationsbeispiel, weil der Test nicht von externen Dateien abhängen soll. Der sauberere Weg, dies zu tun, ist also:
my $data = {
inputFile => { content => "File content", fileName => 'file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen