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_a와 account_b의 실행 순서는 let과 섞여 있어 파악하기 어렵습니다. Minitest의 setup 메서드처럼 명시적인 설정 블록이 순서 문제를 더 명확하게 해결합니다.