Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

FactoryGirl入門

24,131 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
  • Be the first to comment

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

×