FactoryGirlでtraitを使うとintegration test書くのが捗るという話

注: factory_girlはfactory_botに改名されました。 おなじみfactory_girlがちょっと分かってきたので覚え書きがてらメモです. FactoryGirlって,あちこちで見る事例がシンプルすぎることが多くて手元のある程度複雑なデータ構造のFactoryをどうやって書くか,ピンと来ないことが多い気がします.要試行錯誤ですね. 前提Model この記事で使うModelの前提です.掲示板(Forum)があり,そこに対して記事(Post)を投稿するのですが,記事には商品(Product)が紐付いている,というものです. イメージとしては「おまえらのオススメガジェット教えろ」みたいなのがforumで,postには具体的なコメントと商品を選択して評価スコア(100点満点)と一緒に投稿できる,といったものになります. Rails4前提なので,attr_accessibleは書いていません. ER図は以下の通り. ソースコードは以下の通り. class CreateSampleTables < ActiveRecord::Migration def change create_table :product do |t| t.string :name t.integer :price end create_table :forum do |t| t.string :title t.text :description end create_table :post do |t| t.integer :post_id t.integer :product_id t.string :body t.integer :score end end end 各modelの定義は以下の通り class Product < ActiveRecord::Base has_many :posts end </pre> <pre class=”brush: ruby; toolbar: false;”> class Forum < ActiveRecord::Base has_many :posts end </pre> <pre class=”brush: ruby; toolbar: false;”> class Post < ActiveRecord::Base belongs_to :forum belongs_to :product end Factoryの作成 さて,とりあえず何も考えずFactoryを書いてみます.良くある記述方法だと以下の様になるかと思います. 実際にはModelごとにfactoryファイルを分けますが,説明の都合上まとめます. FactoryGirl.define do factory :product do |f| name ‘MacBook Pro Retina 15 Early 2013’ price 218800 end factory :forum do |f| title ‘おまいらのオススメガジェット教えれ’ end factory :post do |f| forum product body ‘MBP 15 Retina,まじおすすめ.ドヤリングにぜひ!’ score 100 end end これで,とりあえずFactoryの生成テストを書いてみます. これも普通はファイルを分けます require ‘spec_helper’ describe Product do it ‘has a valid factory’ do expect(FactoryGirl.create(:product)).to be_valid end end describe Forum do it ‘has a valid factory’ do expect(FactoryGirl.create(:forum)).to be_valid end end describe Post do it ‘has a valid factory’ do expect(FactoryGirl.create(:post)).to be_valid end end ここまでが良くあるFactoryGirlのチュートリアルなどで書いてあるテストになります. 単一モデルのチェックであれば,これとMock/Stubを使えばテストを書いていくことができます. Integration Testを書く 次に,複数Modelが関連するテストコードを書いてみます.ここでは,ForumとPost,Productが正しく相互に動いているかどうかを書いていきます. ここでは,Forumの平均スコアを計算するaverage_score(product)のテストを書いてみます. require ‘spec_helper’ describe ‘Forum Post integration’ … Continue reading FactoryGirlでtraitを使うとintegration test書くのが捗るという話