从FactoryGirl更新到factoryBot会导致NoMethodError

den*_*elg 3 ruby rspec factory-bot

我试图将FactoryGirl转换为FactoryBot。这应该不是一个大问题,但我无法使其正常工作。代码:

已添加到宝石文件

gem 'factory_bot'
Run Code Online (Sandbox Code Playgroud)

已添加到spec_helper

FactoryBot.definition_file_paths = %w(spec/factories)
FactoryBot.find_definitions

config.include FactoryBot::Syntax::Methods
Run Code Online (Sandbox Code Playgroud)

FactoryBot.define do
  factory :user do
    first_name 'John'
    last_name  'Doe'
    birthdate  { 21.years.ago }
    admin false
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试运行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>
Run Code Online (Sandbox Code Playgroud)

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

注意:-我做了捆绑安装/更新

Dan*_*llo 8

就像人们在评论中所说的那样,静态属性first_name 'John'在v4上已经过时(请参阅本指南),然后在v5上被删除,替代方法是使它们成为动态属性:first_name { 'John' }

他们甚至还提供了Rubocop来帮助您修复所有工厂:

rubocop \
  --require rubocop-rspec \
  --only FactoryBot/AttributeDefinedStatically \
  --auto-correct
Run Code Online (Sandbox Code Playgroud)

我的建议是缓慢但可靠地迁移,使用FactoryGirlFactoryBot使用相似版本,运行规格,检查所有弃用警告,运行自定义Rubocop来自动更正工厂,然后在阅读变更日志后仅迁移主要版本。

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

很高兴您找到了出路。