Minitest::Spec: RSpec 스타일 테스트 확장
Minitest는 def test_method, Rails 스타일의 test "method", 그리고 Minitest::Spec의 it "tests method"와 같이 다양한 문법 스타일을 제공합니다. 각 스타일은 테스트 파일과 예제를 정의하는 방식에 변화를 주지만, Ruby 개발자에게는 모두 익숙한 DSL(Domain Specific Language)로 느껴집니다.
어설션과 기대의 패러다임 차이
일반 Minitest와 Rails는 “예상되는 어설션이 실제 결과에 대해 참인지 확인”하는 패러다임을 따릅니다.
반면, Minitest::Spec은 RSpec과 유사하게 “실제 동작이 예상 결과와 일치하는지 확인”하는 반대 패러다임을 따릅니다.
코드 예시: Plain Minitest vs Minitest::Spec
Plain Minitest:
ruby
class UserTest < Minitest::Test
def setup
@user = User.new(first_name: "buffy", last_name: "summers")
end
def test_returns_the_full_name
assert_equal "buffy summers", @user.full_name
end
end
Minitest::Spec:
ruby
class UserTest < Minitest::Spec
before do
@user = User.new(first_name: "buffy", last_name: "summers")
end
it "returns the capitalized full name" do
expect(@user.full_name).must_equal "Buffy Summers"
end
end
Minitest::Spec은 setup 대신 before do ... end, test 또는 def test_* 대신 it, 그리고 어설션 대신 expect(실제 동작).must_equal 예상 결과와 같은 기대를 사용합니다. 또한, describe 블록을 사용하여 테스트 컨텍스트를 계층적으로 구성할 수 있습니다.
Minitest::Spec 활성화 방법
### Ruby 애플리케이션
별도의 설정 없이 테스트 클래스가 Minitest::Test 대신 Minitest::Spec을 상속하도록 하면 됩니다. 공식 문서에는 명시되어 있지 않으므로 소스 코드를 통해 확인해야 합니다.
ruby
class UserTest < Minitest::Spec
# ...
end
Rails 애플리케이션
test_helper.rb 파일에 다음 코드를 추가해야 합니다.
ruby
# frozen_string_literal: true
require "rails/test_help"
require "minitest/spec" # Minitest::Spec require
module ActiveSupport
class TestCase
extend Minitest::Spec::DSL # DSL 확장
end
end
Rails에서는 테스트 클래스의 상속을 변경할 필요가 없으며, 기존의 ActiveSupport::TestCase, ActionDispatch::IntegrationTest 등을 그대로 사용합니다.
주의사항 (Gotchas)
setup과 before를 같은 파일에서 혼용하는 것은 권장되지 않습니다.
-
Plain Ruby:
setup과before가 함께 작동합니다. -
Rails:
setup이before보다 먼저 사용되면 정상 작동하지만,before가setup보다 먼저 사용되면setup이 실행되지 않아 테스트가 실패할 수 있습니다.