使用Test :: Mojo帖子上传的文件为空

时间:2018-06-15 14:47:46

标签: perl mojolicious module-build

我已经将Mojolicious Web服务实现为module,通过POST接受文件上传。示例cURL命令:

widget.datasource.item.planned = false;
widget.datasource.item.inProduction = true;
app.datasources.productionPlan.load();

这可以正常工作,处理文件并返回结果。

我现在正试图使用​​Test::Mojo来测试它:

curl -X POST http://localhost:3000/process -F inputFile=@file.txt

测试失败:

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的结构中,但我无法弄清楚在哪里。据我所知,该调用看起来与documentation中给出的示例完全相同。

这是在服务器端处理文件内容的方式:

$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}), ); }; 的结果是测试的空字符串。但是,在cURL调用中,它正确包含文件内容。

1 个答案:

答案 0 :(得分:1)

如@Boroding所示,解决方案确实是用fileName取代file

my $data = {
  inputFile => { file => 't/file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);

据推测,documentation example中缺少这个的原因是测试不应该依赖于外部文件。所以更清洁的方法是:

my $data = {
  inputFile => { content => "File content", fileName => 'file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);