2013-07-29 3 views
3

Почему это не компилируется с ScalaTest 2.0.M5b?Тест ScalaTest, если сортировка по порядку

import org.scalatest.matchers.MatchResult 
import org.scalatest.matchers.BeMatcher 
import org.scalatest.matchers.ShouldMatchers._ 

def sorted[T <% Ordered[T]] = new BeMatcher[Seq[T]] { 
    override def apply(s: Seq[T]) = 
    MatchResult(
     s match { 
      case Seq(h, [email protected]_*) => s.zip(t).forall{ case (x,y) => x < y } 
      case _ => true 
     }, 
     s + " was not sorted", 
     s + " was sorted") 
} 

val s = Seq(1, 2, 3) 
s should be (sorted[Int]) 

Это ошибка, я получаю:

overloaded method value should with alternatives: (beWord: NewCollectionsSpec.this.BeWord)NewCollectionsSpec.this.ResultOfBeWordForAnyRef[scala.collection.GenSeq[Int]] <and> (notWord: 
NewCollectionsSpec.this.NotWord)NewCollectionsSpec.this.ResultOfNotWordForAnyRef[scala.collection.GenSeq[Int]] <and> (haveWord: 
NewCollectionsSpec.this.HaveWord)NewCollectionsSpec.this.ResultOfHaveWordForSeq[Int] <and> (rightMatcher: org.scalatest.matchers.Matcher[scala.collection.GenSeq[Int]])Unit cannot be applied to 
(org.scalatest.matchers.Matcher[Seq[Int]]) 
+0

Скомпилирует: 'convertToAnyRefShouldWrapper (s) должен быть (отсортировано [Int])' –

+0

Вы уверены? Это тоже не компилируется. Возможно, это зависит от версии ScalaTest. –

+0

Я обновил код в вопросе, чтобы исправить ошибку, связанную с просмотром, извините за это. –

ответ

1

s: Seq[Int] неявно преобразуется в SeqShouldWrapper[GenSeq[Int]]. Он не имеет альтернативы should, совместимой с Matcher[Seq[Int]]. Но он имеет def should(rightMatcher: Matcher[GenSeq[T]]). Таким образом, если вы меняете вы согласовань ограничения типа, то все будет компилировать:

def sorted[T <% Ordered[T]] = new BeMatcher[GenSeq[T]] { 
    def apply(s: GenSeq[T]) = 
    MatchResult(
     s match { 
     case Seq(h, [email protected]_*) => s.zip(t).forall { 
      case (x, y) => x < y 
     } 
     case _ => true 
     }, 
     s + " was not sorted", 
     s + " was sorted") 
} 
4

Scalatest уже предоставляет именно такой Сличитель:

seq shouldBe sorted 

Следует отметить, что подобный вид кода

seq should be sorted 

не компилируется.

Смежные вопросы