ruby-on-rails - 什么可能导致工厂机器人无法正确关联 Big Sur 中上传的文件字段
问题描述
升级到 Big Sur 规格后,使用fixture_file_upload
无法正常工作。
我的测试模型具有文件详细信息,例如
t.string "report_file_name"
t.string "report_content_type"
t.integer "report_file_size"
t.datetime "report_updated_at"
我工厂的瘦身版:
FactoryBot.define do
factory :test do
report { fixture_file_upload "#{Rails.root}/spec/factories/paperclip/test_report.pdf", 'application/pdf' }
end
end
堆栈跟踪:
ActiveRecord::RecordInvalid:
Validation failed: Report content type is invalid, Report is invalid
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/configuration.rb:18:in `block in initialize'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluation.rb:18:in `create'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:12:in `block in result'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:9:in `tap'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:9:in `result'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory.rb:43:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:29:in `block in run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:28:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:5:in `association'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:33:in `association'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute/association.rb:19:in `block in to_proc'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:77:in `instance_exec'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:77:in `block in define_attribute'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:56:in `get'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:16:in `block (2 levels) in object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `each'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `block in object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `tap'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluation.rb:13:in `object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:9:in `result'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory.rb:43:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:29:in `block in run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:28:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:5:in `association'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:33:in `association'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute/association.rb:19:in `block in to_proc'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:77:in `instance_exec'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:77:in `block in define_attribute'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:56:in `get'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:16:in `block (2 levels) in object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `each'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `block in object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `tap'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluation.rb:13:in `object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:9:in `result'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory.rb:43:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:29:in `block in run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:28:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:5:in `association'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:33:in `association'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute/association.rb:19:in `block in to_proc'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:77:in `instance_exec'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluator.rb:77:in `block in define_attribute'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:56:in `get'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:16:in `block (2 levels) in object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `each'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `block in object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `tap'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluation.rb:13:in `object'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:9:in `result'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory.rb:43:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:29:in `block in run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:28:in `run'
# /Users/evanlepolt/.rvm/gems/ruby-2.5.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy_syntax_method_registrar.rb:20:in `block in define_singular_strategy_method'
# ./spec/services/submissions/njb_soft_spec.rb:8:in `block (2 levels) in <top (required)>'
FactoryBot 4.8.2 Rails 5.2.2 Ruby 2.5.3
我已经更新了 xcode,并更新/升级了我所有的自制软件。
最糟糕的是,我无法在单独的存储库中重现该问题,这让我认为在我们的存储库中的某个地方我们正在覆盖一些 factory_bot 设置。
在 Linux 和 Mohave 中,这可以正常工作,如果我从工厂中删除报告并在我的规范中的其他地方手动执行,那么它可以在 Big Sur 中工作。
test = create(:test)
test.report = fixture_file_upload "#{Rails.root}/spec/factories/paperclip/test_report.pdf", 'application/pdf'
解决方案
这既不是回形针问题,也不是工厂机器人问题。我的示例代码不正确,因为我们使用的是.tlf
文件,而不是 pdf。然后我们的模型验证了这一点:validates_attachment_content_type :report_layout, content_type: 'text/plain'
在 Big Sur mac 上开始以 json 格式读取此文件,而不是纯文本。
file -b --mime my_file.tlf
# macOS 11.1
application/json; charset=us-ascii
# macOS 10.15.6
text/plain; charset=us-ascii
# Ubuntu 18.04
text/plain; charset=us-ascii
所以内容类型验证失败。答案一直在我面前
推荐阅读
- python - Text 小部件 tkinter 中的标签或文本外观的更改是否有任何撤消功能?
- java - 从使用 YouTube 数据 API 的个人项目中删除 Google 未经验证的警告
- javascript - 头盔内容安全策略全局路径不起作用
- sql - 无法将行插入表格
- python - 在读取文本文件时提取列值
- javascript - Angular Firebase 获取数据同步
- google-apps-script - OAuth2 库产生属性存储配额错误
- python - 根据熊猫中的条件由公司创建一个假人
- java - Maven - Spring Boot Starter 版本
- r - 在 R 中替换现有 excel 报告中的数据时出错