서비스 스펙에서 비즈니스 로직을 테스트합니다. 그래서 단일 모델만 테스트하는 경우는 거의 없고 연관관계에 속해있는 데이터들을 다루어야 합니다. 이런 경우에 it scope 안에서 가상 모델 객체를 생성해서 테스트를 진행해야 하는데요. 이때에 private 메서드는 어떻게 접근해야 하는지 고민이 되었습니다. 결론부터 말씀드리면, rspec은 private 메서드에 직접 접근을 좋아하지 않습니다. 그 private 메서드를 사용하는 public 메서드에 접근해서 테스트하는 것을 선호하죠. 행동 중심 테스트를 추구하니까요. 그렇다고 항상 실무에서 FM(Field Manual)으로만 할 수는 없습니다. ruby, rails 등 제공하는 메서드를 사용해서 코드를 짠 것이 아닌 검증되지 않은 코드, 즉, 개발자가 직접 작성한 코드에 대해서는 private 메서드라 할지라도 테스트를 진행해줘야 합니다. 이 주제에서는 public 메서드 접근과 private 메서드 접근에 대해서 다루겠습니다.
1. factorybot 객체 생성 위치
비즈니스 로직에서 연관관계없이 단일 객체만 테스트하는 경우는 거의 없으므로, it scope 안에서 생성해서 사용해주셔야 합니다. db resources를 사용하는 메서드 중 가장 위에 있는 it scope에서 한 번만 생성해주시면 되겠습니다.
it 'id를 기준으로 각 유저의 정보 확인' do
FactoryBot.create_list(:order, 50)
FactoryBot.create_list(:good, 50)
end
2. public 메서드 접근
BusinessService.new.get_info(date)
- 실제 접근하는 것과 똑같이 접근해주시면 되겠습니다.
3. private 메서드 접근
- service.send(:method, parameter)
BusinessService.new.send(:get_store_for_business, get_date)
5. 작성방법
기본적으로 비즈니스로직을 테스트할 때에는 최소한 중간값과 경곗값을 테스트해보는 것이 가장 좋습니다. 테스트를 진행하실 때 이 두 가지만 기억하시고 하면 되겠습니다. 하지만 중간값, 경곗값이 아닌 그 객체 자체를 받는 경우가 있습니다. 그럴 때에는 그 객체 자체를 받아서 실제 값을 확인해보시면 되겠습니다.
RSpec.describe BusinessService, type: :model do
end
- type을 model로 주어서 RSpec이 관리할 수 있는 범위에 놓는 것이 좋습니다. 그래야 helper를 작성하고 특정 범주 안에 놓고 관리할 수 있기 때문입니다.
describe '#validation_date' do
context '날짜 검증' do
it '통과' do
date = "2020-10-20"
expect(BusinessService.validation_date(date)).not_to eq(false)
end
it '실패' do
cert_date = "2020-02-30"
expect(BusinessService.validation_date(date)).to eq(false)
end
end
end
- 여기에서 중간값은 it ‘통과’ do end 안에 있는 값을 의미합니다.
- 경계값은 it ‘실패’ do end 안에 있는 값을 의미합니다.
describe '#get_info' do
context '인증된 유저들' do
it 'Id를 기준으로 각 유저의 정보 확인' do
FactoryBot.create_list(:order, 50)
FactoryBot.create_list(:good, 50)
date = Time.current.days_ago(2).strftime('%Y-%m-%d')
info = BusinessService.new.get_info(date)
expect(info).to eq(info)
end
end
end
- 이 로직에서는 service.method를 요청하면 필터링이 된 후의 값들이 저장된 객체를 리턴하게 됩니다. 이런 경우에는 그 안에 들어간 데이터 자체를 검사하는 것이 중요합니다. 그래서 그 안에 데이터가 어떻게 들어갔는지를 확인하는 로직을 구성했습니다. puts를 활용해서 들어간 값을 확인하는 방법도 있습니다.
'Ruby On Rails > RSpec' 카테고리의 다른 글
| model spec 작성방법 (0) | 2021.04.10 |
|---|---|
| Feature spec 작성방법 (0) | 2021.04.10 |
| FactoryBot 작성방법 (0) | 2021.02.06 |
| helper spec (0) | 2021.02.06 |
| 각 Spec 기본 구조 (0) | 2021.02.06 |