带有“aka”的Scala Specs2 Matchers不起作用

时间:2015-03-16 12:47:32

标签: scala specs2

Scala Specs2匹配器看起来像这样(例如):

  def haveSizeOf(size: Int): Matcher[ProductElement] = { 
    productElement: ProductElement =>
    val sizeOfproductElement = productElement.size
    sizeOfproductElement aka "size of product element"
  } ^^ beEqualTo(size)

它在代码中执行:

updatedProductElement must haveSizeOf(1)

引发错误:

  

java.lang.Exception的:   'org.specs2.matcher.ThrownExpectations$$anon$1@6a3b7968'

     

不等于

     

'1'

我应该采取哪些不同的方式?

修改  如果aka已删除,则测试成功通过:

   def haveSizeOf(size: Int): Matcher[ProductElement] = { 
        productElement: ProductElement =>
        productElement.size
      } ^^ beEqualTo(size)

1 个答案:

答案 0 :(得分:1)

beEqualTo()将值(例如size)与Any值进行比较,包括org.specs2.matcher.ThrownExpectation,这是您使用aka构建的值。构建haveSizeOf匹配器的正确方法是

def haveSizeOf(size: Int): Matcher[ProductElement] = { 
  productElement: ProductElement =>
  val sizeOfproductElement = productElement.size
  beEqualTo(size).apply(sizeOfproductElement aka "size of product element")
}

每个Matcher[T]都有一个apply方法,它接受Expectation[T]类型的值(基本上期望值是T类型的值加上您构建的可选描述与aka)。

构建相同匹配器而不重用beEqualTo的另一种方法是

def haveSizeOf(size: Int): Matcher[ProductElement] = { 
  productElement: ProductElement =>
  (productElement.size == size,
   s"the size of product element ${productElement.size} is not $size")
}