2015-01-07 1 views
18

Я пытаюсь проверить, что мой пользователь имеет значение фото при загрузке изображения. Он отлично работает в браузере, и основная функциональность теста проходит, но если я попытаюсь утверждать, что 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 ...>>> 

Есть ли чтобы просто убедиться, что контроллер фактически сохранил значение фото в базе данных? Его просто атрибут модели и сохраняет имя файла как строку.

ответ

29

Ответ был использовать 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')))