file - 如何在 scala 的 specs2 测试中使用 jUnit 的 TemporaryFolder?

标签 file junit specs2

我正在使用 Playframework 编写测试,我需要创建一个临时文件。

@RunWith(classOf[JUnitRunner])
class DiagnosticSpec extends Specification {
  @Rule
  val temporaryFolder: TemporaryFolder = new TemporaryFolder()

  "my test" should {
     "run with temporary file" in {
        val file = temporaryFolder.newFile()   // line.35
        // go on with the file
     }
  }
}

但是当我运行这个测试时,它总是抛出异常:

[error]     IllegalStateException: the temporary folder has not yet been created (MyTest.scala:35)

可以在specs2中使用吗?如果没有,如何在specs2中创建一个临时文件,并在测试后自动删除?

最佳答案

您不能将 JUnit 规则与 specs2 一起使用来进行设置/拆卸。为此,您需要使用 AroundExampleFixtureExample:

trait TempFile extends AroundExample {
  // this code is executed "around" each example
  def around[R : AsResult](r: =>Result) = 
    val f = createFile("test")
    try AsResult(r)
    finally f.delete
}

class MySpec extends Specification with TempFile {
  "test" >> {
    // use the file here
    val file = new File("test")
    ...
  }
}

// Or
trait TempFile extends FixtureExample[File] {
  // this code is executed "around" each example
  def fixture[R : AsResult](f: File => R) = 
    val f = createFile("test")
    try AsResult(f(r))
    finally f.delete
}

class MySpec extends Specification with TempFile {
  // the file can be "injected" for each test
  "test" >> { file: File =>
    // use the file here
    ...
  }
}

更新

TemporaryFolder 特性更接近原始的 JUnit 规则:

trait TemporaryFolder extends Specification {
  /** delete the temporary directory at the end of the specification */
  override def map(fs: => Fragments): Fragments = {
    super.map(fs.append(step(delete)))
  }

  lazy val tempDir = {
    val dir = File.createTempFile("test", "")
    dir.delete
    dir.mkdir
    dir
  }

  /** create a new file in the temp directory */
  def createNewFile = {
    val f = new File(tempDir.getPath+"/"+UUID.randomUUID.toString)
    f.createNewFile
    f
  }

  /** delete each file in the directory and the directory itself */
  def delete = {
    Option(tempDir.listFiles).map(_.toList).getOrElse(Nil).foreach(_.delete)
    tempDir.delete
  }
}

class MySpec extends Specification with TemporaryFolder {
  "test" >> {
    // use the file here
    val file = createNewFile
    ...
  }
}

关于file - 如何在 scala 的 specs2 测试中使用 jUnit 的 TemporaryFolder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24584811/

相关文章:

c# - StreamReader 到文件?

java - CDI : @Resource inject in junit weld?

java - Mockito:了解when().thenThrow()函数如何工作

compiler-errors - Specs2结果与MatchResult

scala - Specs2 - 不应在并发环境中使用单位规范样式

android - 将文件从程序共享到 PC

iOS iPod API - 获取实际的歌曲文件

rest - 失眠者同时上传图片和发布数据

java - 使用构造函数参数模拟嵌套类并测试方法

scalaz - 使用 specs2 和 scalaz-scalacheck-binding 来测试法律