FactoryGirl

2197 ワード

なぜfactoryを使うのかgirl


テストを書くとき、データを構築する必要があることがよくあります.作成するデータについては、次のようになります.
  • 特別な理由を除いて、合法的なデータ
  • を構築する必要があります.
  • ほとんどのテストデータについては、一部のフィールド(テストされた内容に関連する)のみを気にし、言い換えれば、残りのフィールドはデフォルトであってもよい.

  • factory girlは、これらの問題を解決するために便利なメカニズムを提供しています.

    factory_girlの使用

  • 原則factoryのwiki解釈は:factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created.オブジェクトを作成する場所もありますが、詳細に注目する必要はありません.テストを書くときは、できるだけデータを作成してfactoryに置くべきです.girlの中.このようなメリットは、一、再利用です.二、抽象を提供し、データをどのように構築するかではなく、テストする部分にもっと注目しましょう.三、メンテナンスが容易である.開発では、データ構造が変化することが多い.私たちはデータの作成を一部に置いて、データ構造が変化したら、変更する必要があります.場所を変更すればいいです.
  • オブジェクトを作成#オブジェクトを作成FactoryGirl.define do factory :user do name "Mike"email "[email protected]"end end FactoryGirl.create(:user, name: "New Name") # => #
    #  
    factory :user do
      sequence(:email) { |n| "user-#{n}@example.com" }
    end
    
    #  , Faker gem
    factory :user do
      sequence(:name) { Faker::Name::name }
    end
    
    #  
    FactoryGirl.create_list(:user, 2) #  user
    
  • 関連オブジェクト
    #  
    FactoryGirl.define do
      factory :user do
        email "[email protected]"
      end
    
      factory :post do
        user
      end
    end
    
    #  
    user = User.new
    user.email = "[email protected]"
    user.save!
    post = Post.new
    post.user = user
    post.save!
    
    #  
    FactoryGirl.define do
      factory :post do
        association :author, factory: :user
      end
    end
    
    #  
    FactoryGirl.define do
      factory :post do
        name "post-name"
    
        factory :post_with_comments do
          after(:create) do |post, evaluator|
            create_list(:comment, 5, post: post)
          end
        end
      end
    end
    
    #  
    FactoryGirl.define do
      factory :post do
        name "post-name"
    
        factory :post_with_comments do
          transient do
            comments_count 5
          end
    
          after(:create) do |post, evaluator|
            create_list(:comment, evaluator.comments_count, post: post)
          end
        end
      end
    end
    create(:post_with_comments, 2) #  comments post
    create(:post_with_comments, 2) #  comments post
    
  • を作成する.