ruby on rails - rails - ¿Cómo realizar correctamente las pruebas de modelo con ActiveStorage en los carriles?
rails active storage image (3)
Acabo de cambiar a usar ActiveStorage en los rieles 5.1.4 y soy nuevo en TDD y me has_one_attached :avatar
averiguar cómo probar un modelo que has_one_attached :avatar
require ''rails_helper''
RSpec.describe User, :type => :model do
let (:valid_user) { FactoryBot.build(:user) }
describe "Upload avatar" do
context "with a valid image" do
it "saves the image" do
valid_user.save!
saved_file = valid_user.avatar.attach(io: File.open("/home/ubuntu/workspace/spec/fixtures/files/avatar.jpg"), filename: "face.jpg", content_type: "image/jpg")
expect(saved_file).to be_an_instance_of(ActiveStorage::Attachment::One)
end
end
end
end
Pero estoy recibiendo el siguiente error:
Failures:
1) User Upload avatar with a valid image saves the image
Failure/Error:
saved_file = valid_user.avatar.attach(io: File.open("/home/ubuntu/workspace/spec/fixtures/files/avatar.jpg"), filename: "face.jpg",
content_type: "image/jpg")
NoMethodError:
undefined method `upload'' for nil:NilClass
Did you mean? load
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/blob.rb:48:in `upload''
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/blob.rb:21:in `block in build_after_upload''
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/blob.rb:16:in `tap''
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/blob.rb:16:in `build_after_upload''
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/blob.rb:26:in `create_after_upload!''
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/attached.rb:25:in `create_blob_from''
# /usr/local/rvm/gems/ruby-2.3.4/gems/activestorage-0.1/lib/active_storage/attached/one.rb:9:in `attach''
# ./spec/models/user_spec.rb:47:in `block (4 levels) in <top (required)>''
¿Alguna pista?
En config / environment / test.rb
config.active_storage.service = :test
En su especificación
it {expect(valid_user.avatar).to be_attached}
Problema resuelto. Después de rastrear el error al método de carga ActiveStorage :: Blob ::, donde decía: Uploads the io to the service on the key for this blob.
Me di cuenta de que no había configurado el servicio de almacenamiento activo para el entorno de prueba. En pocas palabras, simplemente añada:
config.active_storage.service = :test
Al archivo config / environment / test.rb
Resolví usando
FactoryBot.define do
factory :culture do
name ''Soy''
after(:build) do |culture|
culture.image.attach(io: File.open(Rails.root.join(''spec'', ''factories'', ''images'', ''soy.jpeg'')), filename: ''soy.jpeg'', content_type: ''image/jpeg'')
end
end
end
Después
describe ''#image'' do
subject { create(:culture).image }
it { is_expected.to be_an_instance_of(ActiveStorage::Attached::One) }
end