运行 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
我遇到了同样的问题,我最终发现附件不会持久保存到磁盘/存储解决方案中,直到在记录中调用
.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