FactoryGirl入門

22,297 views

Published on

hamamatsu.rb #9
FactoryGirl入門(私が)の資料。

https://github.com/hamamatsu-rb/hamamatsu-rb.github.com/wiki

追加(2013/9/1): 最近は trait なんてのがあるようです。こちらがわかりやすかったです→ http://techracho.bpsinc.jp/morimorihoge/2013_08_23/12744

Published in: Technology
0 Comments
32 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
22,297
On SlideShare
0
From Embeds
0
Number of Embeds
4,968
Actions
Shares
0
Downloads
34
Comments
0
Likes
32
Embeds 0
No embeds

No notes for slide

FactoryGirl入門

  1. 1. FactoryGirl入門 @suchi hamamatsu.rb#9 2011/11/09
  2. 2. なぜGirlなの?
  3. 3. 世界三大ファクトリー
  4. 4. 世界三大ファクトリー• ファクトリーレコード – マンチェスターのインディーズレーベル• アンディ・ウォーホルのファクトリー – ウォーホルのスタジオ – 当時の先鋭アーティストのたまり場• うなぎパイファクトリー – 春華堂によるうなぎパイ工場
  5. 5. おそらく
  6. 6. イーディFactory Girl
  7. 7. サンプル(BBS)https://github.com/suchi/fgbbs
  8. 8. Articleclass Article < ActiveRecord::Base has_many :attaches has_many :comments validates_presence_of :title validates_presence_of :body validates_presence_of :user validates_uniqueness_of :titleend
  9. 9. Attachclass Attach < ActiveRecord::Base belongs_to :article validates_presence_of :filenameend
  10. 10. Commentclass Comment < ActiveRecord::Base belongs_to :article, :dependent => :destroy validates_presence_of :body validates_presence_of :user validates_presence_of :article_idend
  11. 11. Fixture(article.yaml)one: title: タイトル body: こんにちは user: uchiyamatwo: title: また別のタイトル body: どうもどうも user: Cherencov
  12. 12. FactoryGirlFactory.define :article |do| f f.title "タイトル" f.user "uchiyama" f.body "こんにちは"end
  13. 13. FactoryGirl• Factory.create(:article) – Articleインスタンスを返す• Factory.create(:article, :title => " 別のタイトル", :user => "mackato") – 属性をオーバーライドできる• a = Factory.build(:article)• a.changed? #=> true – buildはDBに保存しない
  14. 14. エラー>> Factory.create(:article)ActiveRecord::RecordInvalid: Validation failed: Title has already been taken from d:/usr/ruby-1.8/lib/...
  15. 15. Articleclass Article < ActiveRecord::Base has_many :attaches has_many :comments validates_presence_of :title validates_presence_of :body validates_presence_of :user validates_uniqueness_of :titleend
  16. 16. Sequenceを使うFactory.sequence(:article) do |n| "article_#{n}"endFactory.next(:article)#=> "article_1"Factory.next(:article)#=> "article_2"
  17. 17. Sequence[:article_title, :user_name, :body].each do |sym| Factory.sequence(sym) do |n| "#{sym.to_s}_#{n}" endendFactory.next(:article_title) #=> "article_1"Factory.next(:article_title) #=> "article_2"Factory.next(:article_title) #=> "article_3"
  18. 18. Article.titleにシーケンスを使うFactory.define :article |do| f f.title Factory.next(:article_title) f.user "uchiyama" f.body "こんにちは"end
  19. 19. エラーFactory.define :article |do| f f.title Factory.next(:article_title) f.user "uchiyama" f.body "こんにちは"endFactory.create(:article)#=> ActiveRecord::RecordInvalid: Validation failed: Title has already been taken
  20. 20. 遅延評価Factory.define :article |do| f f.title { Factory.next(:article_title)} f.user "uchiyama" f.body "こんにちは"end
  21. 21. 関連
  22. 22. 添付ファイル付ArticleFactory.define :article_with_attaches, :class => Article do |f| f.title { Factory.next(:article_title) } f.user uchiyama f.body "こんにちは f.attaches [ Factory(:attach), Factory(:attach) ]end• シンボルと作成するクラスが異なる場合 は:classオプションで指定
  23. 23. コメント付ArticleFactory.define :article_with_comment, :class => Article do |f| f.title { Factory.next(:article_title) } f.user uchiyama f.body "こんにちは f.comments [ Factory(:comment), Factory(:comment) ]end• →ロード時にエラー
  24. 24. 遅延評価にしてみるFactory.define :article_with_comment, :class => Article do |f| f.title { Factory.next(:article_title) } f.user uchiyama f.body "こんにちは f.comments {[ Factory(:comment), Factory(:comment) ]}end• →インスタンス作成時にエラー
  25. 25. Commentclass Comment < ActiveRecord::Base belongs_to :article, :dependent => :destroy validates_presence_of :body validates_presence_of :user validates_presence_of :article_idend
  26. 26. after_createを使うFactory.define :article_with_comments, :class => Article do |f| f.title { Factory.next(:article_title) } f.user { Factory.next(:user_name) } f.body こんにちは f.after_create do |article| comments = [ Factory(:comment, :article_id => article.id), Factory(:comment, :article_id => article.id) ] endend• after_create - Article.createが呼ばれた あと、インスタンスを引数に呼ばれる
  27. 27. その他便利な機能• Factory.attributes_for(:article) – 属性のhashを返す – [:title=>"article_title_6", :user=>"uch iyama", :body=>"こんにちは"}• Factory.stub(:article) – stubを作成する
  28. 28. 欠点• Factory名称の名前空間がグローバル• 記法がちょっとダサい• 後発のFablicationはもっと洗練されて いるらしい
  29. 29. TIPS• 実験はコンソールで --sandboxオプ ションをつけて> ruby script/console --sandbox
  30. 30. Q&A

×