如何使用功能测试在 Play Framework 中测试控制器

How to test a controller in Play Framework with a functional test

我正在尝试使用游戏框架版本 2.5.9 对控制器进行功能测试。

我有一个名为 HomeController 的控制器

@Singleton
class HomeController @Inject()(implicit exec: ExecutionContext) extends Controller {
    def index = Action.async {
        Future{
            Ok(views.html.index("Home"))
        }
     }
}

我的观点是这样的

@(message: String)

@main("Home") {
    <h2>Welcome</h2>
}

@main 中的参数是页面标题中的内容 我的测试看起来像这样

class ApplicationTwoSpec extends PlaySpec with OneServerPerSuite with OneBrowserPerSuite with HtmlUnitFactory{

  implicit val ec = Implicits.global

  val homeController = new HomeController()

  implicit override lazy val app = 
    new GuiceApplicationBuilder()
      .router(Router.from{
        case GET(p"/") => homeController.index
      })
      .build()


   "The sample Controler with a server" must {

    "have home in the title" in {
      go to s"http://localhost:9000/"
      pageTitle mustBe "Home"
    }
  }

}

当我 运行 测试回来时

must return and ok response back *** FAILED ***
"[]" was not equal to "[Home]" (ApplicationTwoSpec.scala:37)

我需要做什么才能让它得到正确的响应?

看了scala test plus和playframework的源码后发现了问题

go to s"http://localhost:9000/"

应该是

go to s"http://localhost:$port/"

implicit lazy val portOneServerPerSuite trait 中指定,并从默认端口 19001 的 play.api.test.Helpers 包中获取其默认值。如果我真的需要端口为 9000,我可以还可以使用

覆盖端口
implicit override lazy val port = 9000