使用TableDrivenPropertyChecks混入特性时无法编译

时间:2018-09-06 10:47:22

标签: scala scalatest

我在编译以下代码时遇到问题。

我正在使用TableDrivenPropertyChecks,并且我有类似的东西

trait MyTrait{

def foo: String

}

  "A X" should "do something correctly" in new MyTrait {

    val items =
      Table(
        "id",
          "1"
      )

    forAll(items) { item =>
      val foo = item
      //test condition
    }
}

代码失败,并显示以下消息:

  

由于未定义MyTrait中的成员值foo:String,因此无法创建对象。

我该如何解决?如果我将override val foo outside the forAll放在任意字符串中,则会编译例如

  "A X" should "do something correctly" in new MyTrait {


val items =
  Table(
    "id",
      "1"
  )
override val foo = "1"  //compiles

forAll(items) { item =>

  //test condition
  }
}

更新 我已经通过这样做解决了这个问题

      "A X" should "do something correctly" in {  // take out the new MyTrait here


    val items =
      Table(
        "id",
          "1"
      )

    forAll(items) { item =>
      new MyTrait {  //create my trait here
            override val value = item
      //test condition
}
      }
    }

但是我想知道为什么失败

1 个答案:

答案 0 :(得分:1)

您的原始示例由于作用域而无法编译。如果在顶部作用域上创建new MyTrait,但在循环内定义val foo = item,则该val只是闭包内部的局部变量。如果您考虑一下,这是很合逻辑的,MyTrait的单个实例不可能具有相同属性的多个实现。在您的解决方案中,您创建了MyTrait的多个实例,每个实例都获得了value的单个稳定实现。