如何在 Play Framework 2.0 (Scala) 中插入测试数据?

Posted

技术标签:

【中文标题】如何在 Play Framework 2.0 (Scala) 中插入测试数据?【英文标题】:How do I insert test data in Play Framework 2.0 (Scala)? 【发布时间】:2012-06-21 06:00:21 【问题描述】:

我在让我的测试在我的数据库中插入假数据时遇到了一些问题。我尝试了几种方法,但没有运气。在 FakeApplication 中运行测试时,似乎 Global.onStart 没有运行,尽管我认为我读到它应该可以工作。

object TestGlobal extends GlobalSettings 
  val config = Map("global" -> "controllers.TestGlobal")

  override def onStart(app: play.api.Application) = 
    // load the data ... 
  

在我的测试代码中:

private def fakeApp = FakeApplication(additionalConfiguration = (
  inMemoryDatabase().toSeq +
  TestGlobal.config.toSeq
).toMap, additionalPlugins = Seq("plugin.InsertTestDataPlugin"))

然后我在每个测试中使用running(fakeApp)

plugin.InsertTestDataPlugin 是另一种尝试,但如果没有在 conf/play.plugins 中定义插件,它就无法工作——这是不想要的,因为我只希望在测试范围内使用此代码。

这些都应该有效吗?有没有人成功使用过类似的选项?

【问题讨论】:

InsertTestDataPlugin 拼写正确吗?因为谷歌搜索只提出了这个 SO 问题。 是的,我自己制作了插件,通过扩展插件类 :-) 它在主源中使用时有效,并添加到 play.plugins 中。它有一个 onStart 方法。但这必须在主要来源范围内。 【参考方案1】:

Global.onStart 应该在应用程序启动时执行一次(并且只执行一次),无论它处于何种模式(开发、生产、测试​​)。尝试关注the wiki on how to use Global。

在该方法中,您可以检查数据库状态并进行填充。例如,在测试中,如果您使用内存数据库,它应该是空的,因此请执行以下操作:

if(User.findAll.isEmpty)   //code taken from Play 2.0 samples

      Seq(
        User("guillaume@sample.com", "Guillaume Bort", "secret"),
        User("maxime@sample.com", "Maxime Dantec", "secret"),
        User("sadek@sample.com", "Sadek Drobi", "secret"),
        User("erwan@sample.com", "Erwan Loisant", "secret")
      ).foreach(User.create)   

  

【讨论】:

这是否意味着 running(FakeApplication("global"->"path.to.my.Global")) 在测试中没有效果? @Arve 我不确定,但我确信另一种方式可行,正如您在 scala 示例(zen 项目)中看到的那样 似乎 Global 不是这样做的地方,特别是如果您希望不同的数据库内容用于不同的测试。看看我是如何在自己的答案中解决的。【参考方案2】:

我选择用另一种方式解决这个问题:

我做了一个这样的夹具:

def runWithTestDatabase[T](block: => T) 
  val fakeApp = FakeApplication(additionalConfiguration = inMemoryDatabase())

  running(fakeApp) 
    ProjectRepositoryFake.insertTestDataIfEmpty()
    block
  

然后,我不使用running(FakeApplication()) /* ... */,而是这样做:

class StuffTest extends FunSpec with ShouldMatchers with CommonFixtures 
  describe("Stuff") 
    it("should be found in the database") 
      runWithTestDatabase        // <--- *The interesting part of this example*
        findStuff("bar").size must be(1);
      
    
  

【讨论】:

以上是关于如何在 Play Framework 2.0 (Scala) 中插入测试数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Play Framework 2.0 (Scala) 中插入测试数据?

如何使用 Play Framework 2.0 下载文件

Play framework 2.2.0 打印最终解决的依赖列表

Play Framework - 使用参数重定向

Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”

将项目升级到 Play Framework 的 2.2.0 版本