각 테스트 실패시 전체 컬렉션을 인쇄하지 않고도 ScalaTest forEvery 속성을 사용할 수 있습니까? 테스트를 실행하려고하는 콜렉션은 꽤 많습니다 (천 개가 넘는 요소). 테스트 로그에서 그 내용을 보는데별로 관심이 없습니다. 특히, 문제가되는 텍스트 행이 이미 수집 된 오류에 인쇄되어있는 경우 메시지. 그 콜렉션을 사용하는 6 개의 테스트를 갖는 것도 도움이되지 않습니다.ScalaTest - 전체 컬렉션을 인쇄하지 않고 forEvery를 사용하는 방법?
1
A
답변
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
에 대한 사실이 보유하고있는 경우 성공)
모든 실패한 요소를 나열하는 것이 내가 원하는 것입니다. 그렇지 않으면 간단한 foreach로 충분합니다. 내가 원하지 않는 것은 테스트를 통과하지 못한 요소 아래에 전체 컬렉션을 인쇄하는 것입니다. – AlexBG
현재이를 방지 할 방법이 없습니다. 그것은 결국 당신이 상관하지 않는다면 "무시"할 수 있습니다. 무시하는 것이 얼마나 어려운지 설명해 주시겠습니까? 표준 출력 기자 출력에서 스크롤해야 할 필요가 있습니까? –
내가 말했듯이, 나는 함께 테스트를 실행하는 컬렉션은 거대합니다. 그것은 천 가지 요소를 넘어서고, 아마도 2k에 가깝습니다. 그게 걱정하지 않는 여러 화면의 텍스트이고, 그 중 하나가 실패 할 때만입니다. 하나 이상의 실패가있는 경우 상황은 더욱 악화됩니다. 나는 이미 추한 솔루션을 발견했으며, 슬프게도 텍스트를 필터링하는 합리적인 방법이없는 것처럼 보입니다. 내 노트북에 액세스 할 때 몇 시간 안에 게시 할 예정입니다. – AlexBG