1

我正在使用 playframework 2.6 和 play-slick 0.8.0。

动作代码:

def addCompany = Authenticated {
 DBAction(parse.json) {
   implicit rs => {
     val newCompany = rs.request.body
     val result = CompanyTable.insert(newCompany.as[Company])(rs.dbSession)

     if(result > 0)
       Ok("{\"id\":"+result+"}")
     else
       Ok("New company was not created.")
   }
 }
}

Action 是仅检查有效会话的 Action 和 DBAction 的组合,后者要求请求正文具有有效的 JSON 对象。

测试代码:

"should create a Company from a Json request" in new InMemoryDB {

  val newCompany = Company(name = "New Company1")

  val fr = FakeRequest(POST, "/company")
    .withSession(("email", "bob@villa.com"))
    .withHeaders(CONTENT_TYPE -> "application/json")
    .withJsonBody(Json.toJson(newCompany))

  val action = controllers.CompanyController.addCompany

  val result = action(fr).run

  status(result) should be_==(OK)
  (contentAsJson(result) \ "id").as[Long] should be_>(1L)

}

InMemoryDB 类只是一个带有预填充内存数据库的 FakeApplication。

我遇到的问题是,当测试运行时,结果始终是 400,正文内容包含一条消息说 [Invalid Json]。当我使用具有相同 JSON 正文内容的 curl 调用服务时,它可以工作并返回 id。

4

1 回答 1

0

我决定构建一个单独的测试项目,并使用激活器为新项目创建种子。我注意到在生成的测试中使用了不同的调用动作的方法,所以我将我的项目切换为使用这种方法。它起作用了,但我不知道为什么。

新代码:

"should create a Company from a Json request" in new InMemoryDB {

  val newCompany = Company(name = "New Company1")

  val action = route(
    FakeRequest(POST, "/company")
      .withSession(("email", "bob@villa.com"))
      .withHeaders(CONTENT_TYPE -> "application/json")
      .withJsonBody(Json.toJson(newCompany))
  ).get


  status(action) should be_==(OK)
  (contentAsJson(action) \ "id").as[Long] should be_>(1L)

}

如您所见,它使用路由调用而不是调用控制器。

于 2014-12-19T13:26:29.820 回答