我尝试从 FactoryGirl 转换为 FactoryBot。这不应该是一个大问题,但我没有让它工作。编码:

添加到 Gem 文件

gem 'factory_bot'

添加到 spec_helper
FactoryBot.definition_file_paths = %w(spec/factories)
FactoryBot.find_definitions

config.include FactoryBot::Syntax::Methods

工厂
FactoryBot.define do
  factory :user do
    first_name 'John'
    last_name  'Doe'
    birthdate  { 21.years.ago }
    admin false
  end
end

当我尝试运行 rspec 测试时,出现以下错误:
NoMethodError: undefined method 'first_name' in 'user' factory!
   Method_missing at C:/jruby-9.1.17.0/lib/ruby/gems/shared/gems/factory_bot-5.0.2/lib/factory_bot/definition_proxy.rb:97
   block in (root) at <path to factory>

在我看来,gem 已正确加载到项目中,并执行了 factoryBot 代码。但出于某种原因,它无法识别工厂的结构。

笔记:
- 我做了一个捆绑安装/更新

最佳答案

就像人们在评论中所说的,像 first_name 'John' 这样的静态属性在 v4 上已被弃用(检查 this guide ),然后在 v5 上被删除,另一种选择是让它们像动态属性: first_name { 'John' }

他们甚至包括一个 Rubocop 来帮助您修复所有工厂:

rubocop \
  --require rubocop-rspec \
  --only FactoryBot/AttributeDefinedStatically \
  --auto-correct

我的建议是缓慢但可靠地迁移,使用类似版本从 FactoryGirl 迁移到 FactoryBot,运行您的规范,检查所有弃用警告,运行自定义 Rubocop 以自动更正您的工厂,然后仅在阅读 changelog 后迁移主要版本。

我同意消息可能会好一点,通常弃用的主要目标是简化代码并减少分支逻辑,因此一旦弃用警告存在足够的时间并且是时候将其删除,任何对旧用法的检测都会是必须删除的额外代码,这是开源项目中的常见结果。

很高兴你找到了出路。

关于ruby - 从 FactoryGirl 更新到 factoryBot 导致 NoMethodError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55119360/

10-13 02:18