railsのテストのuse_instantiated_fixturesはあまり良くないと思った

最近になって昔書いたrailsのコードを読むと、名前が悪いと思うところが多い。例えば。

  • blog_controller.rb
class BlogController < ApplicationController
  def blog_comments
  end
end

とか、blogに対するコメントであることは、コントローラがBlogControllerなのだから分かるはず。よって冗長。


同じようなものがモデルにもある。

  • blog.rb
class Blog < ActiveRecord::Base
  def blog_comments
  end
end


で、ここからが本題。

self.use_instantiated_fixtures = true の問題

railsでは、テスト時にフィクスチャをインスタンス変数の形式で使うことができる設定があります。test_helper.rbで以下のように書く。

  • test_helper.rb
class Test::Unit::TestCase
・・・
  self.use_transactional_fixtures = true

  # Instantiated fixtures are slow, but give you @david where otherwise you
  # would need people(:david).  If you don't want to migrate your existing
  # test cases which use the @david style and don't mind the speed hit (each
  # instantiated fixtures translates to a database query per test method),
  # then set this back to true.
  self.use_instantiated_fixtures  = true #ここをtrueに


すると、以下のようなフィクスチャをテスト中で@bobと参照できるようになります。

bob:
  id: 1
  name: bob


ですが、フィクスチャ、つまりモデルが増えると、どうでしょうか。blogモデルに対するフィクスチャの名前は「bobs」とかになるのかなと思います。さらに、commentモデルがでてきたら・・・。
機能テストになると、これらのフィクスチャデータを一気に使うことになります。その際に、

  assert_equal comment, @bobs.comment


としても、@bobsが何なのか分かりにくいかと思います。フィクスチャの名前を「bobs_blog」にすれば@bobs_blogと参照できるようになりますが、これは冗長な感じがするので、フィスチャを参照するメソッドを使ったほうが見やすいかなと思います。

  assert_equal comment, blogs(:bobs)