Minitest::Spec은 테스트 코드의 가독성과 유연성을 높이는 여러 기능을 제공합니다.
let을 이용한 변수 정의
-
@ivar대신let(:변수명) { ... }을 사용하여 메모이즈드 인스턴스 변수를 정의할 수 있습니다. -
let은 테스트 예제에서 처음 호출될 때 지연 평가되며, 동일한 테스트 예제 내에서 반복 호출 시 재평가되지 않습니다. -
let은 테스트 예제 간에 재평가되어 상태 누출을 방지합니다. -
복잡한 설정이나 명시적으로 참조되지 않는 객체 생성에는
before do ... end블록이 여전히 유용합니다.
subject를 통한 테스트 대상 명확화
-
subject { 테스트_대상_메서드_호출 }을 사용하여 테스트 대상 메서드를 명시적으로 호출하는 대신subject를 사용할 수 있습니다. -
이는 코드의 가독성을 높이고, 특히 중첩된
describe블록에서 컨텍스트를 명확히 하는 데 효과적입니다. -
let과subject를 함께 사용하면 관련 변수만 조정하여 여러 컨텍스트를 쉽게 실행할 수 있습니다.
중첩된 describe 블록 활용
-
describe블록을 중첩하여 테스트의 컨텍스트를 세분화하고 명확성을 높일 수 있습니다. -
하지만 너무 깊은 중첩은 테스트 출력의 가독성을 해칠 수 있으므로 주의해야 합니다.
minitest-rails 젬을 통한 Rails 통합
-
minitest-rails젬은 Rails 애플리케이션에 Minitest::Spec을 원활하게 통합하는 도구입니다. - 주요 이점:
- 테스트할 클래스(
describe User do)를 명시적으로 선언할 수 있어UserTest와 같은 접미사가 필요 없습니다. - 명시적 타입 캐스팅(
describe User, :model do)을 통해 Minitest가 테스트 종류를 추론하도록 돕습니다. - 메일러, 잡, 라우팅 등을 위한 Spec 스타일의 추가 기대(
must_enqueue_jobs등)를 제공하여 테스트 구문을 일관되게 만듭니다.
- 테스트할 클래스(
-
설치:
Gemfile에gem "minitest-rails"추가 후rails generate minitest:install실행. -
주의사항:
minitest:install제너레이터는 기존 설정을 덮어쓸 수 있으므로--pretend플래그로 미리 변경 사항을 확인하는 것이 좋습니다. - 예상치 못한 문제:
must_enqueue_email_with와 같은 특정 기대는include Minitest::Rails::Expectations::ActionMailer와 같은 수동 모듈 포함이 필요할 수 있습니다. 이는 문서에 명시되어 있지 않지만,ActiveJob기대 모듈의 주석에서 유사한 상황에 대한 언급을 찾을 수 있습니다.