Scala 如何访问Specs2中的测试/示例名称?

Scala 如何访问Specs2中的测试/示例名称?,scala,specs2,Scala,Specs2,我有一些测试共享一个夹具,并希望将这些测试彼此隔离。一种方法是使用测试/示例名称作为“名称空间”的一部分(例如作为目录路径的一部分) 测试/示例名称如何在其内部访问 例如: class MySpec extends Specification { "Something" should { "do something" in { // access String "do something" } "do something else" in {

我有一些测试共享一个夹具,并希望将这些测试彼此隔离。一种方法是使用测试/示例名称作为“名称空间”的一部分(例如作为目录路径的一部分)

测试/示例名称如何在其内部访问

例如:

class MySpec extends Specification {
  "Something" should {
    "do something" in {
      // access String "do something"
    }

    "do something else" in {
      // access String "do something else"
    }
  }
}

因此,您可以通过两种方式完成此操作:

Specs2允许您使用字符串作为片段的可选参数,以便执行以下操作:

class MySpec extends Specification {
  "Something" should {
    "do something" in {
      fragmentName: String =>
        println(fragmentName) //prints do something
        ok
    }

    "do something else" in {
      fragmentName: String =>
        println(fragmentName) //prints do something else
        ok
    }
  }
}
还有一种很黑的方式(我先玩了这个,但就是不能扔掉它): 已更新 这里有一个@Eric建议的“更好”黑客版本

class MySpec extends Specification {
  "Something" should {
    "do something" in {
      val fragmentName = is.examples(0).desc
      println(fragmentName) //prints do something
      ok
    }

    "do something else" in {
      val fragmentName = is.examples(1).desc
      println(fragmentName) //prints do something else
      ok
    }
  }
}

美好的因为它是Scala,所以一定有办法消除样板文件。有什么想法吗?事实上,我刚刚尝试了第一种方法,但它对我不起作用。第一种方法肯定有效。您使用的是哪个specs2版本?确切地说,什么是“不起作用的”?关于第二种方法的一些注释
filter(u.isInstanceOf…).map(u.asInstanceOf…)
最好编码为
collect{case e e:Example=>e}
。然后,有一个
examples
方法可以这样做,因此您可以编写
is.examples
。最后,如果使用了
is
,出于性能原因,最好将此值存储在val中。@Eric我更新了示例,但省略了任何性能调整,谢谢提示。