如何在rails中使用ActiveStorage正确进行模型测试?

我刚刚转向在rails 5.1.4上使用ActiveStorage而且我是TDD的新手并且正在努力弄清楚如何测试has_one_attached :avatar的模型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 

但我收到以下错误:

 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 ' 

任何提示?

我解决了使用

 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 

 describe '#image' do subject { create(:culture).image } it { is_expected.to be_an_instance_of(ActiveStorage::Attached::One) } end 

问题解决了。 在将错误跟踪到ActiveStorage :: Blob :: upload方法之后,它说: Uploads the io to the service on the key for this blob. 我意识到我没有为Test环境设置active_storage.service。 简单地说,只需添加:

 config.active_storage.service = :test 

配置/ environments / test.rb文件