在Factorybot中附加ActiveStorage文件

Qwe*_*tie 2 rspec ruby-on-rails factory-bot rails-activestorage

我正在寻找一种为具有活动存储附件的模型创建工厂的方法

我尝试了这篇文章中的方法

与我的工厂

factory :activity_fit_file, class: 'Activity' do
    association :user, factory: :user
    activity_type {:cycling}
    original_activity_log_file { fixture_file_upload("#{Rails.root}/spec/files/example_fit_file.fit") }
end
Run Code Online (Sandbox Code Playgroud)

但是我得到这个错误

 NoMethodError:
   undefined method `fixture_file_upload' for #<FactoryBot::SyntaxRunner:0x000000000208c5f8>
Run Code Online (Sandbox Code Playgroud)

在ActiveStorage中附加文件的正确方法是什么?

小智 35

该解决方案适用于 Rails 6:

factory :post do
  # ...
  after(:build) do |post|
    post.image.attach(
      io: File.open(Rails.root.join('test', 'fixture_files', 'test.jpg')),
      filename: 'test.jpg',
      content_type: 'image/jpeg'
    )
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 这应该是 Rails 6+ 可接受的解决方案。请注意,您还可以使用 FactoryBot [瞬态属性](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#with-callbacks) 在模型中传递与附件相关的信息,例如 `after (:build) { |项目,ev| item.image.attach(io: File.open(ev.image_path, 'rb'), 文件名: File.basename(ev.image_path), content_type: MiniMime.lookup_by_filename(ev.image_path)) if ev.image_path }` (6认同)

小智 6

Rack::Test::UploadedFile直接尝试:

file { Rack::Test::UploadedFile.new('path', 'image/png') }
Run Code Online (Sandbox Code Playgroud)

  • 好的,这是解决方案,但我忘记在我的测试环境中设置 config.active_storage.service (2认同)
  • 这对我来说已经工作了很多年,但在更新到 Rails 6.1.3 后,它收到了 `ActiveStorage::IntegrityError` 错误。关于该错误的信息也很少。 (2认同)