ruby on rails 4 - ¿Cómo probar que un archivo se carga en un controlador?
ruby-on-rails-4 rspec (1)
Estoy intentando probar que mi usuario tiene un valor de foto cuando subo una imagen. Funciona bien en el navegador, y la funcionalidad básica de la prueba pasa, pero si intento afirmar que user.photo no es nulo, falla. Aqui esta la prueba
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
está produciendo
Failure/Error: expect(user.photo.file).to_not be_nil
expected: not nil
got: nil
Si pongo un depurador al final de la prueba y hago user.photo, obtengo:
(byebug) user.photo
#<PhotoUploader:0x007fa447029480 @model=#<User id: 226, ..... photo: nil>,
@mounted_as=:photo, @storage=#<CarrierWave::Storage::File:0x007fa4468ddbb8
@uploader=#<PhotoUploader:0x007fa447029480 ...>>>
¿Hay alguna forma de asegurarse de que el controlador haya guardado un valor de foto en la base de datos? Es solo un atributo en el modelo y guarda el nombre del archivo como una cadena.
La respuesta fue usar 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'') }
Además, si quisieras usar esto en una fábrica, sería:
Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, ''/spec/fixtures/images/bob-weir.jpg'')))