RSpec에서 'let!' 사용을 피하는 이유와 대안

RSpec and `let!`: Understanding the Potential Pitfalls

작성자
발행일
2025년 11월 06일

핵심 요약

  • 1 RSpec의 `let!`은 테스트의 전제 조건을 모호하게 숨겨 디버깅을 어렵게 만들 수 있습니다.
  • 2 `let!` 대신 `before` 블록 내에서 `let` 변수를 명시적으로 호출하는 것이 테스트 전제 조건의 가시성과 실행 순서 명확성을 높입니다.
  • 3 `let!`은 본질적으로 `let` 정의 후 동일한 이름으로 `before` 블록을 설정하는 것으로, 전제 조건의 의도를 숨기는 경향이 있습니다.

도입

본 글은 RSpec 테스트 코드 작성 시 `let!` 사용을 지양하고 대신 `before` 블록 내에서 `let` 변수를 명시적으로 호출하는 방식을 선호하는 이유를 설명합니다. `let!`은 편리해 보이지만, 실제로는 `let` 변수를 정의한 후 해당 변수를 `before` 블록에서 호출하는 것과 동일하게 작동하며, 이는 테스트 전제 조건의 가독성과 실행 순서에 대한 혼란을 야기할 수 있습니다. 저자는 이러한 접근 방식이 테스트 코드의 명확성과 유지보수성을 저해한다고 주장합니다.

let!의 본질 및 문제점

let!let 정의 후 동일한 이름으로 before 블록을 설정하는 방식으로 작동합니다. 이는 테스트 코드의 가독성과 전제 조건 실행 순서에 혼란을 초래할 수 있습니다.

1. 전제 조건(precondition) 가시성 저하

let!은 테스트 전제 조건 역할을 하지만, 다른 let 문들 사이에 숨겨져 있어 디버깅 시 의도 파악이 어렵습니다. 명시적인 before 블록은 어떤 코드가 테스트 실행 전에 실행되어야 하는지 분명히 전달하여 의도를 명확히 합니다.

  • let! 사용 예시: ruby RSpec.describe Thing do let(:account) { build(:account) } let!(:organisation) { build(:organisation, account: account) } it 'returns specific value' do end end

  • let + before 사용 예시: ruby RSpec.describe Thing do let(:account) { build(:account) } let(:organisation) { build(:organisation, account: account) } before { organisation } it 'returns specific value' do end end

before 블록이 organisation의 사전 생성을 직관적으로 보여주어 가독성이 높습니다.

2. 전제 조건 실행 순서 모호성

여러 let! 문이 일반 let 문과 섞여 있을 때, let!의 실행 순서는 정의된 위치에 따라 결정되지만 이를 한눈에 파악하기 어렵습니다. 이는 예상치 못한 동작을 유발할 수 있습니다. 명시적인 before 블록은 내부에 호출된 변수들의 실행 순서를 코드 순서대로 명확히 보여주어 이러한 문제를 해결합니다.

  • let!으로 인한 순서 혼란 예시: ruby RSpec.describe Thing do let!(:account_a) { build(:user, email: email) } let(:organisation) { build(:organisation, account: account) } let!(:account_b) { build(:user, user: email2) } it 'returns specific value' do end end

account_aaccount_b의 실행 순서는 let과 섞여 있어 파악하기 어렵습니다. Minitest의 setup 메서드처럼 명시적인 설정 블록이 순서 문제를 더 명확하게 해결합니다.

결론

`let!`은 간결해 보일 수 있으나, 테스트의 전제 조건을 숨기고 실행 순서를 모호하게 만들어 코드의 가독성과 유지보수성을 저해할 수 있습니다. 대신 `let` 변수를 정의하고 `before` 블록 내에서 명시적으로 호출하는 방식은 테스트의 의도를 분명히 하고 전제 조건의 실행 순서를 투명하게 드러내어, 장기적으로 더 견고하고 이해하기 쉬운 테스트 스위트를 구축하는 데 기여합니다. 명확하고 예측 가능한 테스트 코드를 위해 이러한 접근 방식을 채택하는 것이 바람직합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!