Uncategorized

FixtureIDは自分で書いてはいけない

ぼくが利用しているフィヨルドブートキャンプで指摘された内容です。

ユーザーフォロー機能に関するテストのプラクティスでのことです。Relatiship(関連)のFixtureIDを自作していたら、「RailsではFixtureのIDを自分で書いちゃダメだよー」という指摘を受けました。

解決策はRelationshipのターゲットラベルを指定して、ActiveRecordの自動生成機能を使うことでした。

FixtureIDを自分で書いてはいけない理由

なんで自分でFixtureIDを作ってはいけないというと、「特定のIDやデータの大小にテストが左右されてしまうため」だそうです。

正直いまの自分にはピンときません。。
おそらくチーム開発に入ったら理解できるんだと思います。

どうやって書けばいいの

ユーザーフォローに関するrelationshipのfixtureの例を下にのせます。

one:
  following_id: 1
  follower_id: 1

two:
  following_id: 2
  follower_id: 2

これでもテストパスするけどバグの元になりやすいらしい(そもそも何も書かなくても Railsが気をきかしてくれるので問題ない)。

自分でFixtureIDを書かないなら、どうやってテストするんだ??
となって調べてみたら下のような解説を見つけました。

Active Record は、フィクスチャのモデル・クラスを反映し、すべての belongs_to 関連を見つけ、FK のターゲット ID (monkey_id: 1) ではなく、関連のターゲット・ラベル (monkey: george) を指定することができます。

引用元:ActiveRecord::FixtureSet

では今回のrelationshipのモデルを見てみる

# frozen_string_literal: true

class Relationship < ApplicationRecord
  belongs_to :following, class_name: 'User'
  belongs_to :follower, class_name: 'User'

  validates :following_id, uniqueness: { scope: :follower_id }
end

関連のターゲットラベルは,following: user, follower: userっぽい。
なので下のように書き直してみる

relationships:
  following: user
  follower: user

テストとおったー!