Skip to content

FactoryGirl 활용하기 #342

@shaynekang

Description

@shaynekang

FactoryGirl을 활용할 때 몇 가지 원칙을 지키면 간결하고 명확한 단위테스트를 작성할 수 있습니다.

  1. DB에 저장할 필요가 없다면 #build를, DB에 저장할 필요가 있다면 #create를 활용한다.
  2. 넣어줄 값이 많지 않다면 #build, #create에서 한꺼번에 넣어준다.
  3. 언제든지 필요한 값은 spec/factories.rb 등에서 디폴트로 설정한다.
  4. 유니크한 값이 필요하다면 sequence를 활용해 매 번 다른 값을 생성한다.
  5. 테스트에 필요한 값은 명시적으로 할당해준다.

5번의 경우 부연설명을 하자면, 단위테스트 결과를 비교하는데 3번에서 지정한 값을 사용한다면 매 번 [spec/factories.rb](https://github.com/Donut Works/Ari/blob/2ca4af182a8acdaba71e628c3358c19ca14f6d09/spec/factories.rb)를 살펴봐야 합니다. 단위테스트가 직관적이지 않게 되죠.
그런고로 단위테스트 안에서 명시적으로 할당하는 것이 좋습니다.

가령 spec/unit/sms_sender.rb 코드의 다음 부분은

user = FactoryGirl.build(:user)
user.phone_number = "010-5445-0754"
user.save!

user2 = FactoryGirl.build(:user)
user2.username = "Tom"
user2.email = "tom@donutworks.com"
user2.phone_number = "010-3232-5374"
user2.save!

notice = FactoryGirl.build(:notice)
notice.save!

저라면 이렇게 수정할 것 같습니다.

user = FactoryGirl.create(:user, phone_number: "010-5445-0754")
user2 = FactoryGirl.create(:user, phone_number: "010-3232-5374")
notice = FactoryGirl.create(:notice)

단위테스트 구조상 username, email이 필요하지 않으니 굳이 선언해줄 필요가 없고, build - save!create로 고쳐줄 수 있습니다. 동시에 create의 인자 안에 phone_number를 넣어줄 수 있죠.

다른 코드도 살펴보고 이와 같이 수정하면 좋겠네요. ㅎㅎ

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions