【问题标题】:Updating from FactoryGirl to factoryBot results in NoMethodError从 FactoryGirl 更新到 factoryBot 导致 NoMethodError
【发布时间】:2019-03-12 10:33:51
【问题描述】:

我尝试从 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' }
  • ^^^ 塞尔吉奥所说的。 Static attributes 在 factory_bot 5 中被删除。
  • @Stefan:不过,错误消息可能会更好。它本来就没有用。
  • @Stefan:是的,这就是问题所在。谢谢!是的,信息可能会更好......

标签: ruby rspec factory-bot


【解决方案1】:

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

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

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

我的建议是缓慢但肯定地迁移,使用类似版本从 FactoryGirl 转到 FactoryBot,运行您的规范,检查所有弃用警告,运行自定义 Rubocop 以自动更正您的工厂,然后仅迁移看了changelog之后的大版本。

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

很高兴你找到了出路。

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多