動かざることバグの如し

近づきたいよ 君の理想に

FactoryBotでmethodカラムを定義するとエラーになる件

背景

Railsのテストには外せないライブラリと言っても過言ではないテストデータの生成管理用ライブラリことthoughtbot/factory_bot

しかし、あるテストでいつもどおりにモデルのテストデータを書いてたらエラーになった。

FactoryBot.define do
  factory :hoge_model do
    method { "get" }
  end
end

普通にDBのカラムに method ってのがあって、それを定義しているだけなのだが、よくわからないエラー。ここをコメントアウトすると直る。

どうも method がFactoryBotの予約語と衝突しているんじゃないかと思ってきた。

原因と対策

本当に予約語でした。本当にありがとうございました。

が、FactoryBotは親切なので、公式ドキュメントに回避方法まで記載されていた。

以下のように修正すればいつもどおりにmethodカラムが定義できて、テストもちゃんと通るようになる。

add_attribute(:method) { "get" } # methodが予約語のため

ちなみにドキュメントにも案内があるように、予約語はFactoryBot::DefinitionProxyのUNPROXIED_METHODSに定義されている。

2019年9月12日現在では以下

  • send
  • id
  • nil?
  • send
  • object_id
  • extend
  • instance_eval
  • initialize
  • block_given?
  • raise
  • caller
  • method

なるほどこの一番下のmethodとバッティングしてしまったというわけか けど他は被りそうもないし、そこまで毎回気をつけないといけないわけではなさそう