我正在用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
...
}
}