2013年8月29日木曜日

FactoryGirl Traits

FactoryGirlしりーず

Traits

これもよく使う

factory :user do
  name 'murajun1978'
  
  trait :admin do 
    admin true
  end

  trait :general do 
    admin false
  end

  factory :admin_user,   traits: [:admin]
  factory :general_user, traits: [:general]
end

とか

factory :user do 
  name 'murajun1978'
  
  trait :admin do 
    admin true
  end

  trait :general do 
    admin false
  end
end

factory :admin_user, parent: :user do 
  admin
end

こんな感じでもかける

使い方
FactoryGirl.create(:admin_user)
FactoryGirl.create(:user, :general)

どちらでもおk

複数レコードを作りたい場合
FactoryGirl.create(:user, 2, :general)

シーケンスと一緒に使おう

ネタが少なくなってきたw

( ̄(エ) ̄)彡☆

2013年8月27日火曜日

FactoryGirl Inheritance

FactoryGirlしりーず

Inheritance

みんな大好きお手軽継承です

spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }

    factory :admin_user do 
      admin true
    end
  end
end

ブロックの外に書きたい場合は

FactoryGirl.define do
  factory :user do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }
  end

  factory :admin_user, parent: :user do ← ここ
    admin true
  end
end

両方ともこんな感じでつかえるよ

FactoryGirl.create(:user)
FactoryGirl.create(:admin_user)

admin_userでcreateするとadminフラグがtrueのユーザができる

かんたんヘ(^o^)ノ

2013年8月26日月曜日

FactoryGirl Associations

FactoryGirlしりーず

Associations

factories/users.rb
FactoryGirl.define do
  factory :user, aliases: [:author] do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }

    factory :user_posts do
      ignore do ←これ
        count 1
      end

      after(:create) do |user, value|
        FactoryGirl.create_list(:post, value.count, author: user)
      end
    end
  end

  factory :post do 
    author ←ここ
    sequence(:title) {|n| "text#{n}"}
  end
end

factories/post.rb
factory :post do 
  association :author, factory: :user ←ここ
  sequence(:title) {|n| "text#{n}"}
end

でも、このままだとbuildしたときにuserオブジェクトが作られない

factories/post.rb
factory :post do 
  association :author, factory: :user, strategy: :build ←ここ
  sequence(:title) {|n| "text#{n}"}
end

strategy: :buildオプションを指定するとbuildだけでuserオブジェクトも一緒に作成されるよ

明日は継承について書こうかなヘ(^o^)ノ

FactoryGirlしりーずとか書いてるけどFactoryGirlのGetting Startedにすべてがあるので…

そっちを見るのがはやいかも(;・∀・)

2013年8月23日金曜日

FactoryGirl Sequences ignore …

FactoryGirlしりーず

Sequences

これはよく使う
factory :post do 
  author
  sequence(:title) {|n| "test#{n}"} ←これ
end

test1,test2,test3と連番でvalueをセットできるよ

ignore

これは僕は知らなかった
factories/users.rb
FactoryGirl.define do
  factory :user, aliases: [:author] do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }

    factory :user_posts do
      ignore do ←これ
        count 1
      end

      after(:create) do |user, value|
        FactoryGirl.create_list(:post, value.count, author: user)
      end
    end
  end

  factory :post do 
    author
    sequence(:title) {|n| "text#{n}"}
  end
end

models/user.rb
require 'spec_helper'

describe User do
  context "example1" do 
    subject {FactoryGirl.create(:user)}
    its(:name){should eq 'murajun1978'}
  end

  context "example2" do 
    subject {FactoryGirl.create(:post)}
    its("author.name"){should eq "murajun1978"}
  end

  context "example3" do ←これ
    before {FactoryGirl.create(:user_posts, count: 5)}
    it {Post.should have(5).posts}
    it {User.should have(1).user}
  end
end

countを引数で指定するとそのレコード数だけ作成してくれる

countを指定しなければデフォルト値がセットされるよ

上の例だと1回だね

ちなみに…

have(5).postsのpostsは任意なのでitemsとかなんでもおkヘ(^o^)ノ

FactoryGirl Aliases

FactoryGirlとRSpecをすこしずつまとめようとおもう

まずはFactoryGirlのAliasesから

こんなテーブルがあるとする
User
 name
 password_digest

Post
 title
 author_id

model/user.rb
class User < ActiveRecord::Base
  has_secure_password

  has_many :posts
end

model/post.rb
class Post < ActiveRecord::Base
  belongs_to :author, class_name: 'User'
end

factories/users.rb ←ここ
FactoryGirl.define do
  factory :user, aliases: [:author] do
    name 'murajun1978'
    password 'murajun1978'
    password_confirmation { |u| u.password }
  end

  factory :post do 
    author
    title 'test'
  end
end

spec/models/user_spec.rb
require 'spec_helper'

describe User do
  context "example1" do 
    subject {FactoryGirl.create(:user)}
    its(:name){should eq 'murajun1978'}
  end

  context "example2" do 
    subject {FactoryGirl.create(:post)}
    its("author.name"){should eq "murajun1978"}
  end
end

specの書き方はさておき(;・∀・)

こんな書き方ができまするヘ(^o^)ノ