webentwicklung-frage-antwort-db.com.de

Wie kann man mit ActiveStorage in Schienen Modellprüfungen durchführen?

Ich habe gerade auf ActiveStorage on Rails 5.1.4 umgestellt und bin neu in TDD. Ich habe Schwierigkeiten, herauszufinden, wie man ein Modell testen kann, das 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

Ich erhalte jedoch die folgende Fehlermeldung:

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)>'

Irgendwelche Hinweise?

19
Donato Azevedo

Ich löste mich mit

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

Nach dem

describe '#image' do
  subject { create(:culture).image }

  it { is_expected.to be_an_instance_of(ActiveStorage::Attached::One) }
end
13
vgsantoniazzi

Problem gelöst. Nachdem ich den Fehler auf die ActiveStorage :: Blob :: upload-Methode zurückverfolgt hatte, sagte er: Uploads the io to the service on the key for this blob. Ich erkannte, dass ich den active_storage.service nicht für die Testumgebung festgelegt hatte. Einfach gesagt, einfach hinzufügen:

config.active_storage.service = :test

In die Datei config/umwelts/test.rb

12
Donato Azevedo

In config/environ/test.rb

config.active_storage.service = :test

In Ihrer Spezifikation

it {expect(valid_user.avatar).to be_attached}

0
rexmadden