
フィクスチャはメンテナンスしづらい
書籍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で新規作成したタイミングでリモートにアクセスするような処理があったとして
class Item <ActiveRecord::Base
before_create :do_something_with_remote
def do_something_with_remote
open(self.url)
end
end
この場合、テストの時はItem#do_something_with_remoteをスタブにするよね。
item = Item.new :url => 'http://www.example.com'
item.stub! :do_something_with_remote
本当はこんな感じでかけたい
Item.stub_instance_method(:do_something_with_remote)
stubはそのオブジェクトにしか使えない?インスタンスメソッドまで影響するスタブはどう書けば良い?
--
Fixtureの代わりにFactoryGirlを使い始めた。
これがなかなかシンプルで使い勝手が良いんだけど、関連を設定する時に上記のような作りの場合にちょっと困っている。
Factory.defineの中でインスタンスのメソッドにstubを設定できればいいんだよな。
Factory.define :item, :class => Item do |item|
item.stub!(:do_something_with_remote)
end
明日改造できるかソースコードを見てみる。
Factory.stubはあるんだし、できないことはないよな。
今は時間がないのでスペックヘルパーで
class Item
def do_something_remote;end
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でもいいんですが、何も考えずに使っていると下の画像のようになります。

ま、これでもいいっちゃいいんですが
フォーマットを買えてリスト表示(specdoc)にしたいなぁと思いました。
spec -cfs spec/hoge_spec.rb
こうオプションを渡した時みたいにね。
spec/spec.opts
specフォルダの中にspec.optsというファイルがあります。こいつの内容を見ると
--colour
--format progress
--loadby mtime
--reverse
おー、見覚えのある文字列が。。specコマンドに渡せるオプションをここに書けばフォーマットも変えることができそう。
--colour
--format specdoc
--loadby mtime
--reverse
こう書き換えたら・・

こうなりました。
こっちの方がいいっすね。
Posted in
ruby on rails,
日記 at 3月 30th, 2009.
No Comments.