web-dev-qa-db-ja.com

ファイルがコントローラーにアップロードされていることをテストするにはどうすればよいですか?

画像をアップロードするときに、ユーザーが写真の値を持っていることをテストしようとしています。ブラウザでは正常に動作し、テストの基本機能は合格ですが、user.photoがnilでないことを表明しようとすると、失敗します。これがテストです

describe 'POST #update' do
  context 'when there is an image' do
    it 'renders the crop template' do
      login(user)
      photo = File.open(File.join(Rails.root, '/spec/fixtures/images/bob-weir.jpg'))
      post :update, user: { photo: photo }

      expect(response).to render_template('crop')
      user.reload
      expect(user.photo.file).to_not be_nil
    end
  end
end

生産しています:

Failure/Error: expect(user.photo.file).to_not be_nil
       expected: not nil
            got: nil

テストの最後にデバッガーを配置してuser.photoを実行すると、次のようになります。

(byebug) user.photo

#<PhotoUploader:0x007fa447029480 @model=#<User id: 226, ..... photo: nil>,
@mounted_as=:photo, @storage=#<CarrierWave::Storage::File:0x007fa4468ddbb8 
@uploader=#<PhotoUploader:0x007fa447029480 ...>>>

コントローラが実際に写真の値をデータベースに保存したことを確認する方法はありますか?これはモデルの単なる属性であり、ファイル名を文字列として保存します。

18
Greg Blass

答えはfixture_file_uploadを使用することでした: http://api.rubyonrails.org/classes/ActionDispatch/TestProcess.html#method-i-fixture_file_upload

post :update, user: { photo: fixture_file_upload('images/bob-weir.jpg', 'image/jpg') }

また、これを工場で使用したい場合は、次のようになります。

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