글쎄, 여기서 다루는 내용이 많습니다. 그래서 나랑 벗었 어.
먼저 테스트 이름을 읽을 수 있습니다. 그리고 그들은 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; DR은 test/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
최고 응답 그러나 나는 형식을 테스트 이름을 추출하기 위해 후크 또는 프록이 아닌 조금 놀랐어요 . 나는 루비의 공개 수업이 그것들을 불필요하게 만든다고 생각한다. – everett1992