SlideShare a Scribd company logo
1 of 36
Download to read offline
FactoryGirl入門

     @suchi


              hamamatsu.rb#9
                  2011/11/09
なぜ
Girlなの?
世界三大
ファクトリー
世界三大ファクトリー
• ファクトリーレコード
 – マンチェスターのインディーズレーベル
• アンディ・ウォーホルのファクトリー
 – ウォーホルのスタジオ
 – 当時の先鋭アーティストのたまり場
• うなぎパイファクトリー
 – 春華堂によるうなぎパイ工場
おそらく
イーディ
Factory
  Girl
サンプル(BBS)




https://github.com/suchi/fgbbs
Article
class Article < ActiveRecord::Base
  has_many :attaches
  has_many :comments

 validates_presence_of :title
 validates_presence_of :body
 validates_presence_of :user

  validates_uniqueness_of :title
end
Attach
class Attach < ActiveRecord::Base
  belongs_to :article

  validates_presence_of :filename
end
Comment
class Comment < ActiveRecord::Base
  belongs_to :article,
             :dependent => :destroy

  validates_presence_of :body
  validates_presence_of :user
  validates_presence_of :article_id
end
Fixture(article.yaml)
one:
  title: タイトル
  body: こんにちは
  user: uchiyama

two:
  title: また別のタイトル
  body: どうもどうも
  user: Cherencov
FactoryGirl
Factory.define :article |do| f
  f.title "タイトル"
  f.user "uchiyama"
  f.body "こんにちは"
end
FactoryGirl
• Factory.create(:article)
  – Articleインスタンスを返す
• Factory.create(:article, :title => "
  別のタイトル", :user => "mackato")
  – 属性をオーバーライドできる
• a = Factory.build(:article)
• a.changed? #=> true
  – buildはDBに保存しない
エラー
>> Factory.create(:article)
ActiveRecord::RecordInvalid:
   Validation failed:
    Title has already been taken
        from d:/usr/ruby-1.8/lib/...
Article
class Article < ActiveRecord::Base
  has_many :attaches
  has_many :comments

 validates_presence_of :title
 validates_presence_of :body
 validates_presence_of :user

  validates_uniqueness_of :title
end
Sequenceを使う
Factory.sequence(:article) do |n|
  "article_#{n}"
end

Factory.next(:article)
#=> "article_1"
Factory.next(:article)
#=> "article_2"
Sequence
[:article_title, :user_name, :body].each do |sym|
  Factory.sequence(sym) do |n|
    "#{sym.to_s}_#{n}"
  end
end

Factory.next(:article_title) #=> "article_1"
Factory.next(:article_title) #=> "article_2"
Factory.next(:article_title) #=> "article_3"
Article.titleにシーケンスを使う
Factory.define :article |do| f
     f.title Factory.next(:article_title)
     f.user "uchiyama"
     f.body "こんにちは"
end
エラー
Factory.define :article |do| f
      f.title Factory.next(:article_title)
      f.user "uchiyama"
      f.body "こんにちは"
end
Factory.create(:article)
#=> ActiveRecord::RecordInvalid: Validation failed:
    Title has already been taken
遅延評価
Factory.define :article |do| f
  f.title { Factory.next(:article_title)}
  f.user "uchiyama"
  f.body "こんにちは"
end
関連
添付ファイル付Article
Factory.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オプションで指定
コメント付Article
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



• →ロード時にエラー
遅延評価にしてみる
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



• →インスタンス作成時にエラー
Comment
class Comment < ActiveRecord::Base
  belongs_to :article,
             :dependent => :destroy

  validates_presence_of :body
  validates_presence_of :user
  validates_presence_of :article_id
end
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)
    ]
  end
end


• after_create - Article.createが呼ばれた
  あと、インスタンスを引数に呼ばれる
その他便利な機能
• Factory.attributes_for(:article)
  – 属性のhashを返す
  – [:title=>"article_title_6", :user=>"uch
    iyama", :body=>"こんにちは"}
• Factory.stub(:article)
  – stubを作成する
欠点
• Factory名称の名前空間がグローバル
• 記法がちょっとダサい
• 後発のFablicationはもっと洗練されて
  いるらしい
TIPS
• 実験はコンソールで --sandboxオプ
  ションをつけて

> ruby script/console --sandbox
Q&A

More Related Content

What's hot

Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talksMasahiro Nagano
 
Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方Hiroshi Okano
 
Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstartHideki Saito
 
Packerを使ってみよう(aws編)
Packerを使ってみよう(aws編)Packerを使ってみよう(aws編)
Packerを使ってみよう(aws編)Okubo Tomoyuki
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちKinuko Yasuda
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリMasaki Oshikawa
 
distinctUntilChanged の使いどころ
distinctUntilChanged の使いどころdistinctUntilChanged の使いどころ
distinctUntilChanged の使いどころ正之 安宅
 

What's hot (9)

Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talks
 
Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方
 
Haikara
HaikaraHaikara
Haikara
 
Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstart
 
Packerを使ってみよう(aws編)
Packerを使ってみよう(aws編)Packerを使ってみよう(aws編)
Packerを使ってみよう(aws編)
 
Redmine Ansible
Redmine AnsibleRedmine Ansible
Redmine Ansible
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたち
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリ
 
distinctUntilChanged の使いどころ
distinctUntilChanged の使いどころdistinctUntilChanged の使いどころ
distinctUntilChanged の使いどころ
 

Similar to FactoryGirl入門

FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Yukiko Kato
 
Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723Tetsuko Komma
 
WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~
WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~
WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~hokori matu
 
ゼロからつくるWord pressテーマ第6回
ゼロからつくるWord pressテーマ第6回ゼロからつくるWord pressテーマ第6回
ゼロからつくるWord pressテーマ第6回Hitsuji
 
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」タカシ キタジマ
 
WebAppDev勉強会 #4
WebAppDev勉強会 #4WebAppDev勉強会 #4
WebAppDev勉強会 #4Kohei Noda
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料gaaupp
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法regret raym
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)AyakaNishiyama
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5Tomo Mizoe
 
WordCamp Tokyo2012 Session
WordCamp Tokyo2012 SessionWordCamp Tokyo2012 Session
WordCamp Tokyo2012 Sessionregret raym
 
JavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsiderJavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsiderTsuyoshi Yasunishi
 
Real world android akka
Real world android akkaReal world android akka
Real world android akkaTaisuke Oe
 
CakePHP2 Loading (Japanese)
CakePHP2 Loading (Japanese)CakePHP2 Loading (Japanese)
CakePHP2 Loading (Japanese)ichikaway
 
WordBech Osaka No.28
WordBech Osaka No.28WordBech Osaka No.28
WordBech Osaka No.28Kite Koga
 

Similar to FactoryGirl入門 (20)

FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】
 
Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~
WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~
WordPress3.0 新デフォルトテーマ Twenty Ten 大解剖! ~秋バージョン~
 
ゼロからつくるWord pressテーマ第6回
ゼロからつくるWord pressテーマ第6回ゼロからつくるWord pressテーマ第6回
ゼロからつくるWord pressテーマ第6回
 
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
 
WebAppDev勉強会 #4
WebAppDev勉強会 #4WebAppDev勉強会 #4
WebAppDev勉強会 #4
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
Firefoxosハンズオン
FirefoxosハンズオンFirefoxosハンズオン
Firefoxosハンズオン
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5
 
WordCamp Tokyo2012 Session
WordCamp Tokyo2012 SessionWordCamp Tokyo2012 Session
WordCamp Tokyo2012 Session
 
JavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsiderJavaScript ライブラリーを使い倒そう #buildinsider
JavaScript ライブラリーを使い倒そう #buildinsider
 
Real world android akka
Real world android akkaReal world android akka
Real world android akka
 
CakePHP2 Loading (Japanese)
CakePHP2 Loading (Japanese)CakePHP2 Loading (Japanese)
CakePHP2 Loading (Japanese)
 
WordBech Osaka No.28
WordBech Osaka No.28WordBech Osaka No.28
WordBech Osaka No.28
 

More from Shigeru UCHIYAMA

Ruby on Windows (uru/RubyInstaller/Devkit)
Ruby on Windows (uru/RubyInstaller/Devkit)Ruby on Windows (uru/RubyInstaller/Devkit)
Ruby on Windows (uru/RubyInstaller/Devkit)Shigeru UCHIYAMA
 
Rubykaigi2013ミニ報告 - hmrb#30 LT
Rubykaigi2013ミニ報告 - hmrb#30 LTRubykaigi2013ミニ報告 - hmrb#30 LT
Rubykaigi2013ミニ報告 - hmrb#30 LTShigeru UCHIYAMA
 
メタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいメタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいShigeru UCHIYAMA
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道Shigeru UCHIYAMA
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例Shigeru UCHIYAMA
 

More from Shigeru UCHIYAMA (6)

Ruby on Windows (uru/RubyInstaller/Devkit)
Ruby on Windows (uru/RubyInstaller/Devkit)Ruby on Windows (uru/RubyInstaller/Devkit)
Ruby on Windows (uru/RubyInstaller/Devkit)
 
私とApple - hmrb#34 LT
私とApple - hmrb#34 LT私とApple - hmrb#34 LT
私とApple - hmrb#34 LT
 
Rubykaigi2013ミニ報告 - hmrb#30 LT
Rubykaigi2013ミニ報告 - hmrb#30 LTRubykaigi2013ミニ報告 - hmrb#30 LT
Rubykaigi2013ミニ報告 - hmrb#30 LT
 
メタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいメタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しい
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 

FactoryGirl入門