Perl 与Test::Mojo post一起上载的文件为空

Perl 与Test::Mojo post一起上载的文件为空,perl,mojolicious,module-build,Perl,Mojolicious,Module Build,我已经实现了一个Mojolicous Web服务,作为一个通过POST接受文件上传的服务器。示例cURL命令: curl -X POST http://localhost:3000/process -F inputFile=@file.txt 这将按预期工作,处理文件并返回结果 我现在正尝试使用以下方法进行测试: my $t = Test::Mojo->new( 'TK::Proxy' ); my $data = { inputFile => { filename =&g

我已经实现了一个Mojolicous Web服务,作为一个通过POST接受文件上传的服务器。示例cURL命令:

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");
}

结果是,
$input->{inputFile}->slurp的结果是测试的空字符串。但是,在cURL调用中,它正确地包含了文件内容。

解决方案,如@Boroding所示,确实是将
文件名
替换为
文件

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);

请同时出示相关的申请代码好吗?Module::Build与此有何关联?我看不出相关性。我假设Module::Build不相关,它只会导致测试使用
/Build test
运行。然而,我不确定是否存在不明显的关系。我已经添加了相关的服务器端代码。为什么要使用curl访问URL路径
/process
,而在Perl代码中访问
/v1/documents/process
?同样,为什么要用curl发送
file.txt
,而用Perl发送
t/file.txt
?我怀疑问题在于您正在使用
filename
而不是
file
来指定
inputFile
表单字段的内容。如果没有
文件
内容
,则无法指定要发送的数据。如果您编写
inputFile=>{file=>'t/file.txt'}
,Mojolicious将添加适当的
filename
Content-Type
值。@Borodin谢谢,为了可读性,我缩短了端点,但不幸的是没有一致性;固定的。似乎您是对的,它需要是
文件
而不是
文件名
,但我还不能尝试。通过继承,我已经能够在Mojo::UserAgent文档()中找到一个可能合适的示例。
my $data = {
  inputFile => { content => "File content", fileName => 'file.txt' },
};
$t->post_ok('/process' => form => $data)->status_is(200);