注意
Some(List()) must beSome(List())
也不行。
'Some(List())' is Some but List() is not equal to
'org.specs2.matcher.ValueChecks$$anon$4@48d1978f'
Actual: List()
Expected: org.specs2.matcher.ValueChecks$$anon$4@48d1978f
所以问题不在于Nil
我们知道我们真正在做的事情是这样的:
Some(List()).must(beSome(List()))
beSome 似乎有问题。让我们看看beSome 返回了什么:
val bl = beSome(List()) // SomeCheckedMatcher[Int]
val bn = beSome(Nil) // SomeCheckedMatcher[Int]
这看起来不对,因为返回类型就像是检查一个整数的选项:
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检查元素是否为Some(_)
beSome(exp)检查元素是否为Some(exp)
beSome(matcher) 检查元素是否为Some(a),其中 a 满足匹配器
beSome(function: A => AsResult[B]) 检查一个元素是否为Some(a) 其中function(a) 返回一个成功的Result(注意
Seq[A] 也是一个函数 Int => A 所以如果你想检查一下
一个序列包含在 Some 你需要使用匹配器:
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))