web-dev-qa-db-ja.com

Rails Rspecリクエスト仕様でファイルをアップロードする方法

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

コントローラでは、文字列を取得します

"#Rack :: Test :: UploadedFile:0x0055b544479128>"

実際のファイルの代わりに。

同じコードがコントローラーテストで機能する

13
hirowatari

fixture_file_uploadを使用してみてください: fixture_file_upload

またはこれを工場で使用したい場合

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

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を追加するのを忘れたと思います。追加してお知らせください。

お役に立てば幸いです。

3
Rajdeep Singh

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
Argonus

他のユーザーに役立つかもしれません。仕様でgetリクエストの代わりにpostリクエストを誤って使用したため、この問題が発生しました。

0
wacha

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 } }
0
S.Chub