프로그래밍/Rails

Rspec 기초

choidacheeze 2020. 10. 27. 16:27

describe/ it / expect

describe(RSpec.describe)는 테스트의 그룹화를 선언
번역하면 ~을 기술한다. ~을 설명한다 등의 의미

it은 테스트를 example단위로 정리하는 역할
it do ... end의 expectation이 모두 패스하면 그 example은 통과됨
expect(X).to eq Y처럼 기대값과 실제값을 비교함을 기술하는 것이 expectation.

Nested describe

describedescribe안에 몇개든 네스트되어 사용할 수 있다.
기본적인 역할은 테스트의 그룹화 이므로 적절히 그룹화한다면 테스트가 어떤 기능을 테스트하는지 알기 쉽게 기술할 수 있다.

context and before

RSpec에는 describe이외에도 context라는 기능을 사용해 테스트를 그룹화 할 수 있다.
기능적으로는 같지만, context는 조건을 조건별로 나눌 때 주로 사용된다.

before do ... end는 example의 실행전 매번 불려진다.
before블록에는 테스트 실행 전, 공통처리나 데이터를 셋업하는 등을 기술하는 것이 일반적이다.

Use before in nested describe or context

beforedescribecontext마다 사용가능
describecontext가 네스트되어 있는 경우 부모자식관계에 따라 before가 순서대로 불려진다.

let

RSepc에서는 let을 사용하여 변수 선언이 가능하다.
let은 지연평가가 가능
예를 들어

RSpec.describe User do
  describe '#greet' do
    let(:user) { User.new(params) }
    let(:params) { { name: 'name', age: age } }
    context 'over 12' do
      let(:age) { 12 }
      it 'answer result' do
        expect(user.greet).to eq 'I'm 12'
      end
    end
    context 'over 13' do
      let(:age) { 13 }
      it 'answer result' do
        expect(user.greet).to eq 'I'm 13'
      end
    end
  end
end

이라고 했을 때 "over 13" 문맥에서,
최종적으로 userUser.new(name: 'name', age: 13)을 갖게 된다.

subject

테스트대상의 오브젝트가 정확히 1개의 오브젝트일 때, subject라는 기능을 사용해 코드를 DRY할 수 있다.
예를 들어 위의 코드를 subject를 사용한다고 하면,

RSpec.describe User do
  describe '#greet' do
    let(:user) { User.new(params) }
    let(:params) { { name: 'name', age: age } }
    subject { user.greet }
    context 'over 12' do
      let(:age) { 12 }
      it 'answer result' do
        is_expected.to eq 'I'm 12'
      end
    end
    context 'over 13' do
      let(:age) { 13 }
      it 'answer result' do
        is_expected.to eq 'I'm 13'
      end
    end
  end
end

로 바꿀 수 있다.
subject { user.greet }을 선언했으로 exptect부분을 is_expected로 바꿔 선언한 subject를 실행하도록 한다.
이때 it 의 설명 부분도 생략이 가능한데,

it { is_extpected.to eq 'I'm 13 }

으로 축약할 수도 있다.

'프로그래밍 > Rails' 카테고리의 다른 글

Rails App에 Bootstrap 사용하기  (0) 2020.12.30
_path와 _url의 차이  (0) 2020.11.10
Rails에 Rspec, Factory_bot 설정하기  (0) 2020.10.14