首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在控制器中测试文件是否上传?

如何在控制器中测试文件是否上传?
EN

Stack Overflow用户
提问于 2015-01-07 13:37:23
回答 1查看 8.5K关注 0票数 20

当我上传一张图片时,我正在尝试测试我的用户是否有照片值。它在浏览器中工作得很好,测试的基本功能也通过了,但是如果我试图断言user.photo不是nil,它就会失败。下面是测试

代码语言:javascript
复制
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

正在产生:

代码语言:javascript
复制
Failure/Error: expect(user.photo.file).to_not be_nil
       expected: not nil
            got: nil

如果我在测试结束时放置一个调试器并执行user.photo,我会得到:

代码语言:javascript
复制
(byebug) user.photo

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

有没有办法确保控制器确实在数据库中保存了一个照片值?这只是模型上的一个属性,它将文件名保存为字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-07 13:54:37

答案是使用fixture_file_upload:http://api.rubyonrails.org/classes/ActionDispatch/TestProcess.html#method-i-fixture_file_upload

代码语言:javascript
复制
post :update, user: { photo: fixture_file_upload('images/bob-weir.jpg', 'image/jpg') }

此外,如果您想在工厂中使用它,它将是:

代码语言:javascript
复制
Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, '/spec/fixtures/images/bob-weir.jpg')))
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27813046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档