一些List specs2匹配器

时间:2015-10-29 11:37:46

标签: scala specs2

为什么不进行以下工作?

Some(List()) must beSome(Nil)

'一些(列表())'有些但是List()不等于' org.specs2.matcher.ValueChecks $$anon $ 3@480ba116'

1 个答案:

答案 0 :(得分:1)

请注意

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,所以如果你想检查一下   一些序列包含在一些你需要使用匹配器:   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))