Scala spec2 object.productID必须_ ==“123”失败

时间:2013-04-28 15:10:53

标签: scala specs2

我已更新了我的问题,删除旧文字以便于阅读。

scalaVersion  := "2.10.1"
"org.specs2"          %%  "specs2"        % "1.13" % "test"

我的spec2测试:

package com.mycompany.dataminer.parser

import org.specs2.mutable.Specification

case class Product(productID:String)

class SimpleTest  extends Specification {

  "product" should {

    "have id = 123" in {
      var product1 = Product("123")
      product1 must not beNull
      product1.productID must_== "123"

      var product2 = Product("123")
      product2 must not beNull
      product2.productID must_== "123"

      var product3 = Product("123")
      product3 must not beNull
      product3.productID must_== "123"
    }
  }

}

结果:

scala: type mismatch;
 found   : String
 required: org.specs2.matcher.Matcher[com.mycompany.dataminer.parser.Product]
      product1.productID must_== "123"
               ^

一旦我编写了这段代码,就可以了,直到我添加这些代码:

product1 must not beNull
product2 must not beNull
product3 must not beNull

2 个答案:

答案 0 :(得分:4)

这是Scala的表达式解析(半列推断)以及specs2模型匹配的方式的问题。

第一个匹配器product1 must not beNull的行被解释为product1.must(not) beNull。这意味着beNull处于没有参数的方法调用的位置,但如果它有参数,则它们必须是Matcher[Product]类型。这是因为整个表达式的类型为MatchResult[Product],而MatchResult特征具有apply方法。

结果是Scala推断出第一行表达式的参数位于第二行product1.productID并且类型为String,这是意外的。

这种情况有3种解决方法:

  • 换行符

    product1 must not beNull
    
    product1.productID must_== "123"
    
  • 半列

    product1 must not beNull;
    product1.productID must_== "123"
    
  • 一个括号not

    product1 must not(beNull)
    
    product1.productID must_== "123"
    

这将在下一个specs2版本中通过将MatchResult[T].apply方法设为私有来减轻,以便将编译错误转换为method apply in trait MatchResult cannot be accessed in org.specs2.matcher.MatchResult[Product],并在此方法的Scaladoc中添加潜在问题的描述。

答案 1 :(得分:1)

我的猜测:

  1. 导入名称冲突,或
  2. 规范中有些不妥之处
  3. 以下验收测试示例可能提供了一个线索:  

     import org.specs2.Specification
     import xyz.{Product => TestProduct}  // <- Alias the "Product" package

    trait MyTestHelper { val pId = "123" lazy val product = new TestProduct.Product(pId, ...) // <-- Class to test }

    class MyTest extends Specification with MyTestHelper { def is = ("Product should be " + pId) ! product.ProductID must be_==("123") ^ end }