簡體   English   中英

一些列表spec2匹配器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM