Rails 5将文件POST文件作为Minitest中的主体

时间:2017-03-05 12:23:40

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

我的text / fixtures / filesfolder中有一个小图像文件,我试图用它来调用外部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

不幸的是,如果我这样做,结果是无效的请求参数:无效的%-encoding,这是有道理的,因为我发布了一个参数,而不是一个正文。

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

2 个答案:

答案 0 :(得分:0)

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

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= ...

答案 1 :(得分:-1)

我用过这个:

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