Файл загружен с 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);
Другие вопросы по тегам