使用 Test::Mojo post 上传的文件为空
File uploaded with Test::Mojo post is empty
我已经将 Mojolicious Web 服务实现为 module,它接受通过 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
调用 and/or $data
的结构中,但我无法弄清楚在哪里。据我所知,该调用看起来与 documentation.
中给出的示例完全一样
服务器端是这样处理文件内容的:
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 调用中,它正确包含文件内容。
如@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);
我已经将 Mojolicious Web 服务实现为 module,它接受通过 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
调用 and/or $data
的结构中,但我无法弄清楚在哪里。据我所知,该调用看起来与 documentation.
服务器端是这样处理文件内容的:
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 调用中,它正确包含文件内容。
如@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);