ruby-on-rails-4 - 如何测试文件是否上传到 Controller 中?

标签 ruby-on-rails-4 rspec carrierwave factory-bot uploader

我正在尝试测试我的用户在上传图像时是否具有照片值。它在浏览器中运行良好,并且测试的基本功能通过了,但是如果我尝试断言 user.photo 不为零,它就会失败。这是测试

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

有什么方法可以确保 Controller 实际上在数据库中保存了照片值?它只是模型上的一个属性,它将文件名保存为字符串。

最佳答案

答案是使用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')))

关于ruby-on-rails-4 - 如何测试文件是否上传到 Controller 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27813046/

相关文章:

ruby-on-rails - has_many 的表格 :through

ruby-on-rails - 如何在 RAILS 中使用参数访问 JSON 数组

rest - RSpec "No routes matches"

mysql - ActiveRecord 将 'AND (1=0)' 追加到查询末尾

ruby-on-rails - ActiveAdmin 有条件地显示列

循环的 Ruby 测试结果

ruby - 如何在 ruby​​/rspec 中卸载 'require'?

ruby-on-rails - 如何将本地文件上传到 Carrierwave 模型?

ruby-on-rails - Devise + omniauth +carrierwave 不保存 facebook 个人资料图片

ruby-on-rails - Carrierwave - 从没有文件扩展名的远程图像 url 上传