如何解决 ActiveStorage::FileNotFoundError: 使用 rspec 运行测试时?

问题描述 投票:0回答:1

运行 rspec 时,我使用 ActiveStorage 收到文件未找到错误,但我不知道出了什么问题。 这就是它的设置方式。

存储.yml

test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

配置/环境/test.rb

config.active_storage.service = :test

工厂

factory :user do
  membership_approval { Rack::Test::UploadedFile.new("#{Register::Engine.root}/spec/fixtures/membership.pdf", 'application/pdf') }
end

邮件示例

def mail_example(user:)
  filename = user.membership_approval.filename.to_s
  attachments[filename] = user.membership_approval.download

  mail(
    ...
  )
end

当我运行 rspec 时,当它尝试下载文件时,我收到以下错误消息。

错误信息

ActiveStorage::FileNotFoundError:
# ------------------
# --- Caused by: ---
# Errno::ENOENT:
#   No such file or directory @ rb_sysopen - /Users/myuser/Projects/my_project/tmp/storage/nd/5h/nd5hlet2n2xa673f8v11ljbnru72

否则它工作正常,但我似乎无法让它与 rspec 一起工作。当我在 rspec 中调试时,看起来文件已附加到对象,但没有物理存储在任何地方。有什么想法吗?

致以诚挚的问候。

编辑

我也在工厂尝试过这种方法,但没有运气,我仍然遇到同样的错误。

after(:build) do |user|
  user.membership_approval.attach(
    io: File.open("#{Register::Engine.root}/spec/fixtures/membership.pdf"),
    filename: 'membership.pdf',
    content_type: 'application/pdf'
  )
end
ruby-on-rails rspec rails-activestorage
1个回答
0
投票

我遇到了同样的问题,我最终发现附件不会持久保存到磁盘/存储解决方案中,直到在记录中调用

.save
。因此,在您的情况下,您可以在工厂中通过以下方式触发此操作:

after(:build) do |user|
  user.membership_approval.attach(
    io: File.open("#{Register::Engine.root}/spec/fixtures/membership.pdf"),
    filename: 'membership.pdf',
    content_type: 'application/pdf'
  )
  user.save
end
© www.soinside.com 2019 - 2024. All rights reserved.