一些列表 specs2 匹配器

Some List specs2 matcher

为什么以下不起作用?

Some(List()) must beSome(Nil)

'Some(List())' 是 Some 但 List() 不等于 'org.specs2.matcher.ValueChecks$$anon@480ba116'

请注意

Some(List()) must beSome(List())

也不行。

 'Some(List())' is Some but List() is not equal to 
 'org.specs2.matcher.ValueChecks$$anon@48d1978f' 
 Actual:   List()
 Expected: org.specs2.matcher.ValueChecks$$anon@48d1978f

所以问题不是Nil

我们知道我们真正在做的是这样的:

 Some(List()).must(beSome(List()))

beSome 似乎有问题。让我们看看 beSome 是什么 returning:

val bl = beSome(List())  // SomeCheckedMatcher[Int]
val bn = beSome(Nil)     // SomeCheckedMatcher[Int]

这看起来不对,因为 return 类型就像正在检查整数的选项:

val b = beSome(2)        // SomeCheckedMatcher[Int]

这些不是我们的目标类型:

val myList = List()  // myList: List[Nothing] = List()
val myList2 = Nil    // myList2: scala.collection.immutable.Nil.type = List()

那么,怎么了?

查看documentation (Option/Either),您可以使用beSome以下方式:

  • beSome check if an element is Some(_)

  • beSome(exp) check if an element is Some(exp)

  • beSome(matcher) check if an element is Some(a) where a satisfies the matcher

  • beSome(function: A => AsResult[B]) check if an element is Some(a) where function(a) returns a successful Result (note that a Seq[A] is also a function Int => A so if you want to check that a sequence is contained in Some you need to use a matcher: beSome(===(Seq(1)))

最后一个选项似乎是我们这里的问题。注意 List() 类似于 Seq,一个来自 Int => A 的函数。在我们的示例中:

val myList = List()                 // myList: List[Nothing] = List()
val func: Int => Nothing = myList   // func: Int => Nothing = List()

要解决这个问题,我们应该使用匹配器(文档的第三种选择):

Some(List()) must beSome(beEqualTo(List()))
Some(List()) must beSome(beEqualTo(Nil))

// or 

Some(List()) must beSome(be_==(List()))  
Some(List()) must beSome(be_==(Nil))