ぼくが利用しているフィヨルドブートキャンプで指摘された内容です。
ユーザーフォロー機能に関するテストのプラクティスでのことです。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) を指定することができます。
では今回の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

テストとおったー!