从FactoryGirl更新到factoryBot会导致NoMethodError

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从FactoryGirl更新到factoryBot会导致NoMethodError相关的知识,希望对你有一定的参考价值。

我试图从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后仅迁移主要版本。

我同意这个消息可能会好一些,通常弃用的主要目的是简化代码并减少分支逻辑,所以一旦弃用警告有足够的时间并且是时候删除它,任何旧的使用检测都会是必须删除的额外代码,在开源项目中常见。

很高兴你找到了出路。

以上是关于从FactoryGirl更新到factoryBot会导致NoMethodError的主要内容,如果未能解决你的问题,请参考以下文章

将帮助文件加载到 FactoryBot 文件中会导致“无法加载此类文件”[重复]

FactoryBot拒绝与协会建立工厂

在 factorybot 中附加 ActiveStorage 文件

markdown Factorybotいろいろ

FactoryGirl 覆盖关联对象的属性

在Rails中使用FactoryBot和Rspec的`raise_record_invalid`