最近になって昔書いた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)