代码之家  ›  专栏  ›  技术社区  ›  Carsten

用test::mojo post上载的文件为空

  •  1
  • Carsten  · 技术社区  · 7 年前

    我已经实现了一个mojoliousweb服务 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 调用和/或结构 $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调用中,它正确地包含了文件内容。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Carsten    7 年前

    正如@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);