2016-11-25 135 views
7

我想测试在Rails Rspec请求测试中上传文件的过程。我正在使用Paperclip进行资产存储。如何在Rails Rspec请求测试中上传文件规范

我已经试过:

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

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

“#Rack ::测试:: UploadedFile的:0x0055b544479128>”

而不是实际的文件。

相同的代码在控制器测试

回答

0

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_pathparams: params之间,请添加并让我知道。

希望有帮助!

+0

这两个包括似乎没有帮助(我曾尝试过)。你能在Rails请求规范中获得这个工作吗? – hirowatari

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 
  • 您可以使用上传的文件,但你必须要充分路径

    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 }

  • +0

    我不认为这与RSB的答案有任何实际区别。 – hirowatari

    5

    试使用fixture_file_uploadfixture_file_upload

    或 如果你想使用这个在工厂

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

    'fixutre_file_upload'在引擎盖下使用'Rack :: Test :: UploadedFile',所以这通常是相同的。 – hirowatari

    0

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

    相关问题