Scala 如何访问Specs2中方法前后的测试/示例/片段名称?

Scala 如何访问Specs2中方法前后的测试/示例/片段名称?,scala,specs2,Scala,Specs2,我想做一些类似的事情: class MySpec extends Specification with BeforeAfterExample { var testName var clientDir def before { testName = fragmentName.replaceAll(" ", "-") clientDir = new File(workspaceRoot, testName) clientDir.mkdirs() } d

我想做一些类似的事情:

class MySpec extends Specification with BeforeAfterExample {
  var testName
  var clientDir

  def before {
    testName = fragmentName.replaceAll(" ", "-")
    clientDir = new File(workspaceRoot, testName)
    clientDir.mkdirs()
  }

  def after {
    FileUtils.deleteDirectory(clientDir)
  }
}

这可能会奏效:

class MySpec extends Specification with BeforeAfterExample {
  var currentExample = 0
  var testName = ""
  var clientDir:File = null

  def before {
    testName = is.examples(currentExample).desc.toString.replaceAll(" ", "-")
    clientDir = new File(workspaceRoot, testName)
    clientDir.mkdirs()
  }

  def after {
    FileUtils.deleteDirectory(clientDir)
    currentExample += 1    
  }
}

我认为,如果不做类似这样的黑客行为,就无法在before和after方法中获得太多上下文。

您可以通过使用specs2
ExampleFactory来做您想做的事情。

import org.specs2._
import specification._

class TestSpec extends Specification { def is =
  "test" ! {
    ok
  }
  case class BeforeAfterExample(e: Example) extends BeforeAfter {
    def before = println("before "+e.desc)
    def after  = println("after "+e.desc)
  }
  override def exampleFactory = new ExampleFactory {
    def newExample(e: Example) = {
      val context = BeforeAfterExample(e)
      e.copy(body = () => context(e.body()))
    }
  }
}

API的这一部分最近才打开,因此目前只能在1.15-SNAPSHOT中使用(您可以通过在一个以
org.specs2
开头的包中直接创建工厂来解决较新的specs2版本的此限制)。

有点老套,但这对我来说很有效:

/**
 * Returns the name of the currently executing example
 */
def getCurrentExampleName(spec: Specification): String = {

  val stack = new Exception().getStackTrace
  val specLinesUpStack = for (
    line <- stack
      if line.getClassName.startsWith(spec.getClass.getName))
        yield line.getLineNumber

  spec.is.examples
    .find(e => specLinesUpStack.contains(e.location.lineNumber))
    .get
    .desc.toString()
}
/**
*返回当前正在执行的示例的名称
*/
def getCurrentExampleName(规范:规范):字符串={
val stack=new Exception().getStackTrace
val specLinesUpStack=for(
线条规格linesupstack.contains(如位置、行号))
.得到
.desc.toString()
}

由于为每个示例制作了一份规范副本,因此这不起作用。OTOH,你的回答很有帮助,因为它给了我更多关于specs2如何工作的上下文。我可以在beforeSpec和afterSpec中创建和销毁目录。