光滑和播放控制器测试

时间:2014-09-14 15:03:35

标签: scala playframework slick

有一个播放控制器方法

def insertDepartment = Action(parse.json) { request =>
  MyDataSourceProvider.db.withSession{ implicit session =>
    val departmentRow = DepartmentRow(1, Option("Department1"))
    departmentService.insert(departmentRow)
  }
}

注意MyDataSourceProvider.db正在提供slick.driver.PostgresDriver.simple.Database并创建withSession可向implicit提供session departmentService.insert

当我测试departmentService sessionthis post中提到的文字夹具提供时。 sessionWrapper是一个简单的函数,可以创建session,为测试块提供session并在测试完成后回滚数据。

sessionWrapper { implicit session =>

    val departmentRow = DepartmentRow(1, Option("Department1"))
    departmentService.insert(departmentRow)
}

这可以很好地运行,并且在service测试运行时不会污染数据库。测试不应该在db中保留任何内容,而是在成功执行后回滚。

现在,当测试play controller需要一种方法来使用sessionWrapper时。能够以与service测试类似的方式回滚控制器测试。

MyDataSourceProvider.db.withSession中注意controller insertDepartment

controller 测试sessionWrapper包装没有任何意义,因为控制器def不接受任何implicit session但使用来自MyDataSourceProvider.db.withSession的{​​{1}} {1}}

最好的办法是什么?尝试创建一个trait控制器,以injecttrait进行推测,因此mixin对于测试和真实代码可能会有所不同,但还没有找到方法来#&} 34;通过" session用于测试,用于生产代码。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于Slick阻止,您不需要Action.async。我想知道为什么甚至会编译,因为我不会在那里看到未来,但我对Play并不熟悉。

您可以采取以下几种方法:

  1. 我的最爱:不使用事务回滚进行测试,而是使用测试数据库,为每次测试重新创建。
  2. 拉出

    val departmentRow = DepartmentRow(1, Option("Department1"))
        departmentService.insert(departmentRow)
    

    进入方法并只测试该方法,而不是控制器

  3. 在控制器中使用sessionWrapper,让它检查一个配置标志,告诉它是否处于测试模式并应该进行回滚,或者它是否处于生产模式。