Railsテスト「六」実戦ユニットテスト-fixturesをfactory-girlに置き換えてシミュレーションデータ2を作成

11862 ワード

前回はfactory-girlについて紹介しましたが、railsのfixturesの代わりにシミュレーションデータを生成するための良いツールです.
それは直感的で、読みやすくて、読みやすくてメンテナンスしやすいです.最も重要なのは、モデル向け、ビジネス向け、アプリケーション向けであり、fixturesシミュレーションのデータはデータベース向けである.しかし、私たちのユニットテスト、機能テスト、さらに将来紹介する統合テストは、ビジネス向けであり、ビジネスの観点からのテストであり、システムがビジネスニーズを満たしているかどうかをテストします.だからメリットは明らかで、みんなが使ってから少し感じられると信じています.
前回では、単一モデルのシミュレーションオブジェクトを作成し、プロパティの値を塗りつぶすための基本的な使用について説明しました.

  
  
  
  
  1. FactoryGirl.define do 
  2.   factory :user_valid:class => :User do 
  3.     nickname "nickname" 
  4.     email "[email protected]" 
  5.     password "123" 
  6.     password_confirmation "123" 
  7.   end 
  8.   factory :user_invalid_password_do_not_match:class => :User do 
  9.     nickname "nickname2" 
  10.     email "[email protected]" 
  11.     password "1232" 
  12.     password_confirmation "123" 
  13.   end 
  14. end 

パスワードが一致しないため、2つのuserオブジェクトをシミュレートしました.1つは有効で、1つは無効です.
に合格
 

  
  
  
  
  1. user = FactoryGirl.build(:user_valid

factory-girlシミュレーションのデータにアクセスし、ユニットテストおよび機能テストでこれらのシミュレーションのデータを使用することができます.
 
しかし、時にはより高い要求があります.例えば、私たちのエンティティは関係があります.has_many,belongs_to,has_and_belongs_to_manyなど.モデルを作成しながら、関連エンティティも作成できますか?答えは:いいです.
簡単な関係を挙げましょう.私のblogプロジェクトを持ってきてください.
postとcategoryは、1つのpostが1つのcategoryに属し、1つのcategoryが複数のpostを含む.

  
  
  
  
  1. class Post < ActiveRecord::Base 
  2.   belongs_to :category 
  3. end 
  4. class Category < ActiveRecord::Base 
  5.   has_many :posts 
  6. end 

私たちは次のようにすることができます.

  
  
  
  
  1. FactoryGirl.define  do 
  2.   factory :category do 
  3.     title "category" 
  4.   end 
  5.  
  6.   factory :category_valid:class=>:Category do 
  7.     title "categorytitle" 
  8.   end 
  9. end 
  10.  
  11. FactoryGirl.define  do 
  12.  factory :post_valid_with_category1:class => :Post do 
  13.     title "post" 
  14.     slug "slug" 
  15.     summary "summary" 
  16.     content "content" 
  17.     category 
  18.   end 
  19.  
  20.   factory :post_valid_with_category2:class => :Post do 
  21.     title "post" 
  22.     slug "slug" 
  23.     summary "summary" 
  24.     content "content" 
  25.     association :category:factory => :category_valid 
  26.   end 
  27.  
  28. end 

2つのcategory,2つのpostを2つの方法でシミュレートし,postに対応するcategoryを指定したことを示した.
 

  
  
  
  
  1. build(:post_valid_with_category1).category.title="category" 
  2.  
  3. build(:post_valid_with_category1).category.title="categorytitle" 


上記のように使用すると、postシミュレーションオブジェクトのcategoryシミュレーションオブジェクトにアクセスできます.
もう一つの方法はalias別名を利用することです.
私たちのuserとpostとcommenterが次の関係であると仮定します.

  
  
  
  
  1. class User < ActiveRecord::Base 
  2.   attr_accessible :first_name:last_name 
  3.   has_many :posts 
  4. end 
  5.  
  6. class Post < ActiveRecord::Base 
  7.   attr_accessible :title 
  8.   belongs_to :author:class_name => "User":foreign_key => "author_id" 
  9. end 
  10.  
  11. class Comment < ActiveRecord::Base 
  12.   attr_accessible :content 
  13.   belongs_to :commenter:class_name => "User":foreign_key => "commenter_id" 
  14. end 

次のようにシミュレーションデータを作成できます.

  
  
  
  
  1. factory :user, aliases: [:author:commenterdo 
  2.   first_name    "John" 
  3.   last_name     "Doe" 
  4. end 
  5.  
  6. factory :post do 
  7.   author 
  8.   # instead of 
  9.   # association :author, factory: :user 
  10.   title "How to read a book effectively" 
  11. end 
  12.  
  13. factory :comment do 
  14.   commenter 
  15.   # instead of 
  16.   # association :commenter, factory: :user 
  17.   content "Great article!" 
  18. end 

aliasエイリアスを使用して、userオブジェクトに2つのエイリアスを付け、1つはpost用、1つはcomment用にします.別名はpostとcommentの2つの属性にそれぞれ対応します.
 
 
 
参考文献
1.factory-girl getting started