DonutWorks / Ari

0 stars 0 forks source link

FactoryGirl 활용하기 #342

Open shaynekang opened 9 years ago

shaynekang commented 9 years ago

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를 넣어줄 수 있죠.

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

shaynekang commented 9 years ago

그리고 FactoryGirl은 다양한 헬퍼들이 많으니 살펴보면 큰 도움이 될 겁니다. 찾아보니 이 아티클이 가장 짧고 유익한 것 같네요. ㅎㅎ