factorygirl

フィクスチャはメンテナンスしづらい

書籍The Rails Wayの中には「皆フィクスチャが嫌い」という項目があります(次の項目は「フィクスチャはそれほど悪くない」ですが)。

フィクスチャが嫌われる最大の原因は「メンテナンスが難しい」という事でしょう。
中間テーブルを必要とする多対多の関連をフィクスチャにしようと思ってうんざりした経験は誰にもでもあると思います。

Fixtureのhas_manyでこんな書き方したい
http://www.func09.com/wordpress/archives/369

フィクスチャの代わりにFactoryGirlを使ってみる

Factory GirlはRailsのテストにおいてfixtureの代替となるツールです。
つまりテスト時のモデルデータを用意するための仕組みです。
Factory Girlはフィクスチャと違い、Rubyのスクリプトで直接データを定義していきます。

特徴としては

  • Rubyコードで定義(YAMLやCSVではない)
  • 関連のメンテナンスが楽
  • 定義の継承もできる
  • 同じ定義から連続的なデータを生成できる(シーケンス)

Rubyコードで実データを作る感覚でテストデータを定義するので、フィクスチャと違い中間テーブルのメンテナンスから解放されます。 Read More…

Posted in ruby, ruby on rails, 日記 at 4月 26th, 2009. No Comments.

例えばActiveRecordで新規作成したタイミングでリモートにアクセスするような処理があったとして

  1. class Item <ActiveRecord::Base
  2.   before_create :do_something_with_remote
  3.   def do_something_with_remote
  4.     open(self.url)
  5.   end
  6. end


この場合、テストの時はItem#do_something_with_remoteをスタブにするよね。

  1. item = Item.new :url => 'http://www.example.com'
  2. item.stub! :do_something_with_remote


本当はこんな感じでかけたい

  1. Item.stub_instance_method(:do_something_with_remote)


stubはそのオブジェクトにしか使えない?インスタンスメソッドまで影響するスタブはどう書けば良い?

--

Fixtureの代わりにFactoryGirlを使い始めた。 これがなかなかシンプルで使い勝手が良いんだけど、関連を設定する時に上記のような作りの場合にちょっと困っている。 Factory.defineの中でインスタンスのメソッドにstubを設定できればいいんだよな。

  1. Factory.define :item, :class => Item do |item|
  2.   item.stub!(:do_something_with_remote)
  3. end


明日改造できるかソースコードを見てみる。 Factory.stubはあるんだし、できないことはないよな。

今は時間がないのでスペックヘルパーで

  1. class Item
  2.   def do_something_remote;end
  3. end


みたいに上書きして対処しているが・・・駄目だよな。
FactoryGirlに関してはノウハウが溜まったら書くかも。

Posted in ruby on rails at 4月 24th, 2009. No Comments.

はじめに

The Rails Wayを読了しました。 Railsの本は出版されたら大抵買って読むようにしているのですがその中でもかなり良著だったと思います。 これから読む人はRailsアジャイルによるWebアプリケーション入門の後くらいに読むと良いですね。

さて、Rails Wayの素敵な点はテストに結構なページを割いているという点です。 Rails標準のテストとRspecによるテストにそれぞれ章だててあり、ページ数にすると60Pを超えます。 本当はRspecだけで一冊書いてほしいくらいなんですが、それでも今日本語で読める本としては一番多いと思います。

Rspecの結果表示

rake specでもscript/autospecでもいいんですが、何も考えずに使っていると下の画像のようになります。

e9d34049a45293d49131e67dcf884f90

ま、これでもいいっちゃいいんですが フォーマットを買えてリスト表示(specdoc)にしたいなぁと思いました。

  1. spec -cfs spec/hoge_spec.rb


こうオプションを渡した時みたいにね。

spec/spec.opts

specフォルダの中にspec.optsというファイルがあります。こいつの内容を見ると

  1. --colour
  2. --format progress
  3. --loadby mtime
  4. --reverse


おー、見覚えのある文字列が。。specコマンドに渡せるオプションをここに書けばフォーマットも変えることができそう。

  1. --colour
  2. --format specdoc
  3. --loadby mtime
  4. --reverse


こう書き換えたら・・

9271e70b85e8ca0f662ca3ee02a50f17

こうなりました。

こっちの方がいいっすね。

Posted in ruby on rails, 日記 at 3月 30th, 2009. No Comments.