【问题标题】:How to write isolated unit tests for routes in Play 2.0 framework?如何在 Play 2.0 框架中为路由编写独立的单元测试?
【发布时间】:2012-12-15 08:21:09
【问题描述】:

我的游戏框架应用程序是 scala(不是 Java)。我找到了一个描述如何使用实用程序类 play.test.Helpers 进行单元测试路由的页面。该示例是在 Java 中,而不是 scala。我在 scala 中编写了测试,但出现错误“消息:这不是 JavaAction,不能以这种方式调用。”

这是我找到的描述如何在 play framework 2.0 中对路由进行单元测试的页面:http://digitalsanctum.com/2012/05/28/play-framework-2-tutorial-testing/

...这是我尝试编写的用于测试我的应用的代码:

package conf
import org.scalatest._
import play.mvc.Result
import play.test.Helpers._

class routeTest extends FunSpec with ShouldMatchers {

  describe("route tests") {
    it("") {
      // routeAndCall() fails.  Message: This is not a JavaAction and can't be invoked this way.
      val result = routeAndCall(fakeRequest(GET, "/"))
      result should not be (null)
    }
  }
}

问题是因为我的操作是 Scala 而不是 Java?我可以通过 Scala 控制器对我的路由进行单元测试吗?

【问题讨论】:

    标签: unit-testing playframework-2.0


    【解决方案1】:

    您应该使用来自 Scala 代码的 play.api.* 导入。 play.* 是一个 Java api。所以你的代码应该是这样的:

    package conf
    
    import org.scalatest._
    import org.scalatest.matchers._
    import play.api._
    import play.api.mvc._
    import play.api.test.Helpers._
    import play.api.test._
    
    class routeTest extends FunSpec with ShouldMatchers {
      describe("route tests") {
        it("GET / should return result") {
          val result = routeAndCall(FakeRequest(GET, "/"))
          result should be ('defined)
        }
      }
    }
    

    使用FlatSpec 甚至更好:

    package conf
    
    import org.scalatest._
    import org.scalatest.matchers._
    import play.api._
    import play.api.mvc._
    import play.api.test.Helpers._
    import play.api.test._
    
    class routeTest extends FlatSpec with ShouldMatchers {
    
      "GET /" should "return result" in {
        val result = routeAndCall(FakeRequest(GET, "/"))
        result should be ('defined)
      }
    
      it should "return OK" in {
        val Some(result) = routeAndCall(FakeRequest(GET, "/"))
        status(result) should be (OK)
      }
    
    }
    

    另外,routeAndCall 不返回 null。它返回Option[Result],即Some[Result]None,因此在这种情况下,空值检查不起作用。

    【讨论】:

    • 谢谢!我想知道 play.api.* 和 play.* 之间的区别,但以前从未遇到过问题。非常感谢。一个小改动:我发现“fakeRequest(GET.”/)”需要是“FakeRequest(GET.”/)”,但其他一切都很完美。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多