Файл загружен с Test::Mojo сообщение пустое
Я реализовал Mojolicious Web Service как модуль, который принимает загрузки файлов через POST. Пример команды cURL:
curl -X POST http://localhost:3000/process -F inputFile=@file.txt
Это работает, как и ожидалось, файл обрабатывается и результат возвращается.
Я сейчас пытаюсь проверить это с помощью Test::Mojo, как это:
my $t = Test::Mojo->new( 'TK::Proxy' );
my $data = {
inputFile => { filename => 't/file.txt' },
};
$t->post_ok('/process' => form => $data)
->status_is(200)
Тест не пройден:
$ ./Build test
[...]
# Failed test '200 OK'
# at t/20_app.t line 44.
# got: '400'
# expected: '200'
Отладка кода показывает, что загруженный контент пуст.
Я проверил, что он находит файл, добавив простую печать перед тестом:
open FILE,'<', 't/file.pdf' or die("Could not read file");
while (my $line = <FILE>) {
print STDERR ($line . "\n");
}
Это выводит файл, как и ожидалось.
Отсюда мой вывод, что ошибка в post_ok
вызов и / или структура $data
, но я не мог понять, где. Насколько я могу судить, вызов выглядит точно так же, как в примере, приведенном в документации.
Вот как содержимое файла обрабатывается на стороне сервера:
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}),
);
};
Оказывается, что результат $input->{inputFile}->slurp;
пустая строка для теста. Однако в вызове cURL он правильно содержит содержимое файла.
1 ответ
Решение, на которое указывает @Boroding, должно было заменить fileName
с file
:
my $data = {
inputFile => { file => 't/file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);
Предположительно, причина, по которой это отсутствует в примере документации, заключается в том, что тест не должен зависеть от внешних файлов. Таким образом, более чистый способ сделать это:
my $data = {
inputFile => { content => "File content", fileName => 'file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);