【问题标题】:Some List specs2 matcher一些 List specs2 匹配器
【发布时间】:2015-10-29 11:37:46
【问题描述】:

为什么以下方法不起作用?

Some(List()) must beSome(Nil)

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

【问题讨论】:

  • 您是否尝试过类似的方法:Some(List[TYPE].empty) must beSome(List[TYPE].empty) 即显式使用类型构造函数作为给定类型的列表?
  • 我确认Some(List[Int]()) must beSome(List[Int]()) 工作正常。

标签: scala specs2


【解决方案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 所以如果你想检查一下 一个序列包含在 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))

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2016-07-25
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多