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我更新了示例,但省略了任何性能调整,谢谢提示。