【问题标题】:Rails 5 File POST file as body in MinitestRails 5 File POST文件作为Minitest中的主体
【发布时间】:2017-03-05 12:23:40
【问题描述】:

我的 text/fixtures/files 文件夹中有一个小图像文件,我试图用它来调用外部 API。这是一个JPG。我正在尝试在我的控制器测试中使用此方法对其进行测试

 test 'post image to external API' do
    binding.pry
    image = fixture_file_upload('files/simple_image.jpg', 'image/jpg')
    post '/api/services/image_processor', params: {body: image}
    assert_response :success
  end

不幸的是,如果我这样做,结果是 Invalid request parameters: invalid %-encoding,这是有道理的,因为我发布的是参数而不是正文。

如何将我上传的文件设置为请求的正文?我可以用邮递员发布文件正文,效果很好,但我想自动化测试过程。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 minitest


    【解决方案1】:

    正确的做法是在控制器中使用以下代码

    a) 如果您将文件传递给需要路径的方法(如 CSV 解析器)

    params[:file].path

    b) 或者如果你需要文件内容的话

    params[:file].read

    然后在你的测试中

    file = fixture_file_upload('path/to/some/file.csv')
    post '/api/endpoint',
         params: { file: file },
         headers: { 'content-type': 'multipart/form-data' }
    

    这样在params你会发现一个正常工作的文件上传

    <ActionController::Parameters {"file"=>#<ActionDispatch::Http::UploadedFile:0x007ff3f1ea8e80 @tempfile= ...
    

    【讨论】:

    • 这是一个二进制图像文件,不是 csv
    • Rails 文件上传哪一个无关紧要。您的代码的问题是 .tempfile 在 Rails 5 中不起作用,我很确定在以前的版本中也不起作用。
    【解决方案2】:

    我用过这个:

    image = fixture_file_upload('files/simple_file.jpg', 'image/jpg', :binary)
    post '/api/services/image_processor', params: image.tempfile, headers: { 'CONTENT-TYPE': 'image/jpg' }
    assert_response :success
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多