如何在Rails Rspec请求规范中上传文件

时间:2016-11-25 00:27:37

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

我想测试在Rails Rspec请求测试中上传文件。我正在使用Paperclip进行资产存储。

我试过了:

path = 'path/to/fixture_file'
params = { file: Rack::Test::UploadedFile.new(path, 'application/pdf', true) }
post v1_product_documents_path, params: params

在控制器中,我得到一个字符串

  

“#机架::测试:: UploadedFile的:0x0055b544479128>” 中

而不是实际文件。

相同的代码适用于控制器测试

6 个答案:

答案 0 :(得分:10)

尝试使用 fixture_file_upload fixture_file_upload

或  如果你想在工厂里使用它

 Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, '/spec/fixtures/images/bob-weir.jpg')))

答案 1 :(得分:3)

describe块下,包含这些模块

include Rack::Test::Methods
include ActionDispatch::TestProcess

现在尝试运行规范

path = 'path/to/fixture_file'
params = { "file" => Rack::Test::UploadedFile.new(path, 'application/pdf', true) }
post v1_product_documents_path, params: params

此外,我猜您忘了在,v1_product_documents_path之间添加params: params,请添加并告知我们。

希望有所帮助!

答案 2 :(得分:1)

在rails_helper.rb中执行

include ActionDispatch::TestProcess
include Rack::Test::Methods

然后你几乎没有选择。 1.您可以使用fixture_file_upload帮助

  let(:file) { fixture_file_upload('files/image.jpg') }
  it 'it should work' do
    post some_path, params: { uploads: { file: file } }
  end
  1. 您可以使用已上传的文件,但必须提供完整路径

    let(:file) { Rack::Test::UploadedFile.new(Rails.root.join('spec', 'fixtures', 'blank.jpg'), 'image/jpg') } let(:params) { { attachment: file, variant_ids: ['', product.master.id] } } let(:action) { post :create, product_id: product.slug, image: params }

答案 3 :(得分:0)

对于Rails 6,不需要做包括,仅fixture_file_upload。如果您将spec/fixtures/files文件夹用于固定装置,则可以使用file_fixture帮助程序

let(:csv_file) { fixture_file_upload(file_fixture('file_example.csv')) }

subject(:http_request) { post upload_file_path, params: { file: csv_file } }

答案 4 :(得分:0)

对于其他人在实施上述批准的解决方案后仍然在控制器中获得类似 "#Rack::Test::UploadedFile:0x0055b544479128>" 的内容,我通过将我的 content-type 标头更改为 'application/x-www-form-urlencoded' 来解决此问题,以便接受表单数据.

答案 5 :(得分:-2)

可能对其他用户有用:我遇到了这个问题,因为我错误地在我的规范中使用了get而不是post请求。