2014-10-05 3 views
1

각 테스트 실패시 전체 컬렉션을 인쇄하지 않고도 ScalaTest forEvery 속성을 사용할 수 있습니까? 테스트를 실행하려고하는 콜렉션은 꽤 많습니다 (천 개가 넘는 요소). 테스트 로그에서 그 내용을 보는데별로 관심이 없습니다. 특히, 문제가되는 텍스트 행이 이미 수집 된 오류에 인쇄되어있는 경우 메시지. 그 콜렉션을 사용하는 6 개의 테스트를 갖는 것도 도움이되지 않습니다.ScalaTest - 전체 컬렉션을 인쇄하지 않고 forEvery를 사용하는 방법?

답변

0

그래서 내가 발견 한 해결책은 정말로 추악하고 해킹입니다. EveryEvery (및 다른 Inspector 역시 필자도 의심 스럽습니다.) 작업은 컬렉션의 반복자를 얻을 수 있다면 테스트를 실행하고 컬렉션을 출력하는 것입니다. 내 솔루션은 첫 번째 실행시에만 올바른 반복자를 전달하고 검사자가 반복자를 다시 가져 오려고하면 (즉 컬렉션을 인쇄하기 위해) 반복기가 Seq.empty.iterator를 얻습니다.

def forEvery[E](xs: TraversableOnce[E])(fun: E => Unit): Unit = { 
    class SilentSeq[E](list: TraversableOnce[E]) extends Seq[E] { 
    var silent: Boolean = false 
    def length = 0 
    def apply(i: Int) = list.toIterator.next() 
    def iterator = { 
     if (silent) 
     Seq.empty.iterator 
     else { 
     silent = true 
     list.toIterator 
     } 
    } 
    } 

    Inspectors.forEvery[E, Seq](new SilentSeq(xs))(fun) 
} 

조사관 중 하나 길이를 사용하거나 적용되지 않기 때문에 어떤 내가 넣어 한 올바른 유형이 같은 관련성이있다 :이 코드에 대한라고 할 수있는 가장 좋은 것은 그것이 작동한다는 것입니다. Seq 확장은 GenTraversable 인 척하는 가장 쉬운 방법입니다 (이것은 내 자신의 클래스의 반복자를 사용하는 데 필요합니다). 나는 이것보다 더 좋은 해결책을 발견하게되어 기쁘다.

0

forEvery 대신 forAll을 사용하면됩니다. docs에서

: forAll 그냥 번째의 고장 요소를보고하는 반면 (FORALL과 동일하지만, 모두 나열 실패 요소 것은 실패하면 -

  • forAll은 - 주장이 모든 요소
  • forEvery에 대한 사실이 보유하고있는 경우 성공)
+1

모든 실패한 요소를 나열하는 것이 내가 원하는 것입니다. 그렇지 않으면 간단한 foreach로 충분합니다. 내가 원하지 않는 것은 테스트를 통과하지 못한 요소 아래에 전체 컬렉션을 인쇄하는 것입니다. – AlexBG

+0

현재이를 방지 할 방법이 없습니다. 그것은 결국 당신이 상관하지 않는다면 "무시"할 수 있습니다. 무시하는 것이 얼마나 어려운지 설명해 주시겠습니까? 표준 출력 기자 출력에서 ​​스크롤해야 할 필요가 있습니까? –

+0

내가 말했듯이, 나는 함께 테스트를 실행하는 컬렉션은 거대합니다. 그것은 천 가지 요소를 넘어서고, 아마도 2k에 가깝습니다. 그게 걱정하지 않는 여러 화면의 텍스트이고, 그 중 하나가 실패 할 때만입니다. 하나 이상의 실패가있는 경우 상황은 더욱 악화됩니다. 나는 이미 추한 솔루션을 발견했으며, 슬프게도 텍스트를 필터링하는 합리적인 방법이없는 것처럼 보입니다. 내 노트북에 액세스 할 때 몇 시간 안에 게시 할 예정입니다. – AlexBG