我正在使用 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 一起使用来进行设置/拆卸。为此,您需要使用 AroundExample
或 FixtureExample
:
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/