首页 > 解决方案 > 创建功能测试 Scala Playframework 2.6 Macwire

问题描述

我写了一些特性来使用它作为我的功能测试的基础

该文件用于在内存中创建数据库(H2 + Evolutions)

BlogApiDBTest.scala

package functional.common

import play.api.db.Databases
import play.api.db.evolutions.Evolutions

trait BlogApiDBTest {

  implicit val testDatabase = Databases.inMemory(
    name = "blog_db",
    urlOptions = Map(
      "MODE" -> "MYSQL"
    ),
    config = Map(
      "logStatements" -> true
    )
  )

  org.h2.engine.Mode.getInstance("MYSQL").convertInsertNullToZero = false
  Evolutions.applyEvolutions(testDatabase)
}

在这里,我将覆盖一些注入的组件以进行测试

BlogApiComponentsTest.scala

package functional.common

import common.BlogApiComponents
import org.scalatestplus.play.components.WithApplicationComponents
import play.api.{BuiltInComponents, Configuration}

trait BlogApiComponentsTest extends WithApplicationComponents with BlogApiDBTest {

  override def components: BuiltInComponents = new BlogApiComponents(context) {
    override lazy val configuration: Configuration = context.initialConfiguration
    override lazy val blogDatabase = testDatabase
  }

}

这是我的功能测试的基类

BlogApiOneServerPerTestWithComponents.scala

package functional.common

import org.scalatestplus.play.PlaySpec
import org.scalatestplus.play.components.{OneServerPerTestWithComponents}

trait BlogApiOneServerPerTestWithComponents extends PlaySpec with OneServerPerTestWithComponents with BlogApiComponentsTest {

}

最后我要执行的测试

PostControllerSpec.scala

package functional.controllers

import functional.common.BlogApiOneServerPerTestWithComponents
import org.scalatest.concurrent.{IntegrationPatience, ScalaFutures}
import play.api.mvc.{Results}
import play.api.test.{FakeRequest, Helpers}


import play.api.test.Helpers.{GET, route}

class PostControllerSpec extends BlogApiOneServerPerTestWithComponents
  with Results
  with ScalaFutures
  with IntegrationPatience {

  "Server query should" should {
    "provide an Application" in {
      val Some(result) = route(app, FakeRequest(GET, "/posts"))
      Helpers.contentAsString(result) must be("success!")
    }
  }

}

然后我得到

blog-api/test/functional/controllers/PostControllerSpec.scala:18:31:无法将 play.api.mvc.AnyContentAsEmpty.type 的实例写入 HTTP 响应。尝试定义一个 Writeable[play.api.mvc.AnyContentAsEmpty.type]

这是代码

标签: scalaplayframeworkscalatest

解决方案


添加以下导入应该使其工作:

import play.api.test.Helpers._

看着签名route

def route[T](app: Application, req: Request[T])(implicit w: Writeable[T]): Option[Future[Result]]

我们看到它需要一个implicit w: Writeable[T]. 上述导入将通过Writables提供


推荐阅读