如何使用Play框架读取测试代码中的资源?



问题

我找不到如何使用Play框架在测试代码中包含资源。

我想编写getResource代码@/test/controllers/HomeControllerSpec.scala,如下所示。

"HomeController Test" should {
val inputStream = getClass.getResourceAsStream("test.json")
...
}

但是这段代码要求将"test.json"放在目标目录中。 我找到了一种使用Inject和play.api.Environment的方法,但这种方法在测试代码中效果不佳。

在Playframework中获取资源文件作为输入流

是否有读取测试代码中的资源的最佳实践?

附加信息

我尝试了以下代码@/play/test/controllers/HomeControllerSpec.scala

val source = getClass.getResource("/").getPath
println(source.toString())

我还得到了以下结果(/play 是 play 项目的根(。

/play/target/scala-2.12/test-classes/

通常,/target 被忽略(用 .gitignore 编写(。所以我想知道在播放测试代码(放置在/test(中读取文本文件的方法。

解决方案(已解决。感谢您的评论和帮助。

我尝试了以下命令

sbt "show test:resourceDirectory"

并得到以下结果。

/play/test/resources

这意味着放置在此目录中的文件将用作资源并复制到目标目录(在我的情况下为/play/target/scala-2.12/test-classes(。所以我把test.json放在

/play/test/resources/test.json

并且可以通过以下代码读取此文件。

val source = getClass.getResource("/test.json").getPath
val code = getClass.getResourceAsStream("/test.json")
println("getPath of test.json: "+ source)
println("text of test.json: " + IOUtils.toString(code))

输出

getPath of test.json: /play/target/scala-2.12/test- 
classes/test.json
text of test.json: {
"key": "value"
}

您的项目目录结构(Play 框架(

  • /
    • /.app
    • /conf
    • /测试
      • test.json
      • /控制器
        • HomeControllerSpec.scala

无法从/test访问test.json的原因

  • 源路径(/app/test(中除"*.scala"以外的任何文件都将被排除在外。
  • 编译时,/test中的test.json被排除在外。

替代方式

test.json放在/test/resources

  • /
    • /.app
    • /conf
    • /测试
      • /资源
        • test.json
      • /控制器
        • HomeControllerSpec.scala

另请阅读

  • Play 应用程序中测试的资源目录

最新更新