[英]Some List specs2 matcher
為什么以下工作不起作用?
Some(List()) must beSome(Nil)
'Some(List())'是Some但List()不等於'org.specs2.matcher.ValueChecks$$anon$3@480ba116'
注意
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]
由於返回類型就像正在檢查Option的Integer一樣,所以這種情況並不正確:
val b = beSome(2) // SomeCheckedMatcher[Int]
這些不是我們的目標類型:
val myList = List() // myList: List[Nothing] = List()
val myList2 = Nil // myList2: scala.collection.immutable.Nil.type = List()
那怎么了
查看文檔(Option / Either) ,可以使用beSome
幾種方式:
beSome
檢查元素是否為Some(_)
beSome(exp)
檢查元素是否為Some(exp)
beSome(matcher)
檢查元素是否為滿足匹配器的Some(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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.