tutorial rails example active ruby-on-rails rspec rails-activestorage

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