2014-06-10 6 views
1

새로운 레일스 프로젝트에서 MiniTest를 사용하고 있으며 실제로 테스트를 처음하고 있습니다. 테스트가 실패하면 메시지는 다음과 같이 표시됩니다.최소 시험 등급으로 읽을 수있는 시험 이름

1) Failure: 
Category::when created#test_0002_must have a unique name [/home/caleb/workspace/buzz/test/models/category_test.rb:10]: 
Expected: true 
    Actual: false 

오류를 읽기 쉽도록 # test_0002_를 (를) 다른 문자열로 변경할 수 있습니까? 사소한 문제 인 줄 알지만, 지원되어야하는 것 같습니다.

# Example test 
require 'test_helper' 

describe Category do 
    describe 'when created' do 
    unique = false 
    it 'must not have a unique name' do 
     unique.must_equal false 
    end 
    it 'must have a unique name' do 
     unique.must_equal true 
    end 
    end 
end 

답변

3

글쎄, 여기서 다루는 내용이 많습니다. 그래서 나랑 벗었 어.

먼저 테스트 이름을 읽을 수 있습니다. 그리고 그들은 100 % 정확합니다. 스펙 DSL을 사용할 때 여전히 테스트 클래스와 테스트 메소드를 작성하고 있습니다. 귀하의 경우, 수업은 Category::when created이고 시험 방법은 test_0002_must have a unique name입니다. 그 사이에있는 #은 클래스의 인스턴스 메소드에 대한 Ruby 관용어로 사용되는 테스트 메소드입니다. class 또는 def을 사용할 때 공백이있는 클래스 나 메서드를 만들 수는 없지만 프로그래밍 방식으로 만들면 그렇게 할 수 있습니다. 코드를 실행할 때 Ruby는 공백이 있는지 여부는 신경 쓰지 않습니다.

둘째, 은 테스트 클래스 및 메소드 표시에 영향을줍니다. 이 텍스트는 Minitest::Test#to_s로 전화 한 것입니다. 여기에 그 모습입니다 :

def to_s # :nodoc: 
    return location if passed? and not skipped? 

    failures.map { |failure| 
    "#{failure.result_label}:\n#{self.location}:\n#{failure.message}\n" 
    }.join "\n" 
end 

테스트 후 더 많은 정보는 실패의 원인을 포함, 반환되지 않습니다. 하지만 우리가 신경 쓰는 부분은 location입니다. 다음은 그 모습입니다.

def location 
    loc = " [#{self.failure.location}]" unless passed? or error? 
    "#{self.class}##{self.name}#{loc}" 
end 

아, 더 좋았습니다. 마지막 줄에서 클래스와 메서드 이름이 인쇄되고 있음을 명확하게 볼 수 있습니다. 테스트가 실패하면 위치는 메소드가 정의 된 파일 이름도 포함합니다. 의는 그래서 그들은 인라인되지 않습니다 그 값을 탈출하자

def location 
    loc = " [#{self.failure.location}]" unless passed? or error? 
    test_class = self.class 
    test_name = self.name 
    "#{test_class}##{test_name}#{loc}" 
end 

이 좋아, 조금 더 명확. 먼저 테스트 클래스, 다음 #, 테스트 이름, 그리고 테스트가 통과하지 못하면 위치. 이제 우리는 그것들을 깨뜨렸으므로 조금 수정할 수 있습니다. 의 클래스 네임 스페이스 및 시험 방법을 분리 /를 사용하자 :

def location 
    loc = " [#{self.failure.location}]" unless passed? or error? 
    test_class = self.class.to_s.gsub "::", "/" 
    test_name = self.name 
    "#{test_class}/#{test_name}#{loc}" 
end 

좋아요. 이제 테스트 방법의 시작 부분에서 test_0002_을 제거해 봅시다. 즉,이 사양 DSL에 의해 추가되고, 제거하여 우리는 it 블록에 전달 된 문자열과 일치 할 수있다 : 이제

def location 
    loc = " [#{self.failure.location}]" unless passed? or error? 
    test_class = self.class.to_s.gsub "::", "/" 
    test_name = self.name.to_s.gsub /\Atest_\d{4,}_/, "" 
    "#{test_class}/#{test_name}#{loc}" 
end 

을 테스트 출력은 다음과 같이 표시됩니다

1) Failure: 
Category/when created/must have a unique name [/home/caleb/workspace/buzz/test/models/category_test.rb:10]: 
Expected: true 
    Actual: false 

Minitest 다른 Ruby 라이브러리와 다르지 않습니다. 스펙 DSL은 테스트 클래스 및 메소드를 작성하기위한 단순한 랩퍼입니다. 테스트 객체의 동작을 원하는대로 작동하도록 변경할 수 있습니다.

TL; DRtest/test_helper.rb 파일에 다음을 추가합니다, 나는 이런 식으로 뭔가를 기대

class Minitest::Test 
    def location 
    loc = " [#{self.failure.location}]" unless passed? or error? 
    test_class = self.class.to_s.gsub "::", "/" 
    test_name = self.name.to_s.gsub /\Atest_\d{4,}_/, "" 
    "#{test_class}/#{test_name}#{loc}" 
    end 
end 
+0

최고 응답 그러나 나는 형식을 테스트 이름을 추출하기 위해 후크 또는 프록이 아닌 조금 놀랐어요 . 나는 루비의 공개 수업이 그것들을 불필요하게 만든다고 생각한다. – everett1992