【问题标题】:Play 2.1: unit testing EssentialActions玩法 2.1:单元测试 EssentialActions
【发布时间】:2013-07-23 02:39:53
【问题描述】:

我想对返回EssentialAction 的控制器方法进行单元测试。我将FakeRequest 传递给它,然后返回Iteratee[Array[Byte], Result]

看起来测试助手contentAsStringcontentTypestatus 不接受这种结果类型。

我是否缺少隐式转换?是否有一个控制器在没有提出整个 FakeApplication 的情况下进行单元测试的例子?

【问题讨论】:

    标签: unit-testing playframework-2.1 specs2


    【解决方案1】:

    一个基本动作是RequestHeader => Iteratee[Indata, Result],你可以将它应用到FakeRequest,因为它实现了RequestHeader。要实际执行 iteratee,你要么用数据填充它,要么立即告诉它没有更多的 indata。对于这两种情况,您都会得到一个Future[Result],您需要在测试中等待它。

    因此,对于没有请求正文的简单 GET(使用播放测试助手 await 方法),您可以这样做:

    val iteratee = controllers.SomeController.action()(FakeRequest())
    val result: Result = await(iteratee.run)
    

    如果您想使用请求正文进行请求,则必须做更多的事情才能将请求正文提供给迭代对象,并注意正确编码您的 indata 数据。

    【讨论】:

    • 测试助手 await 方法在哪里?我需要什么进口?
    • play.api.test.Helpers._ 在此处的文档中提到:playframework.com/documentation/2.1.x/ScalaTest 或者好吧,不是等待方法而是导入。
    • 谢谢,帮了大忙
    【解决方案2】:

    在 Play 2.3 中,PlaySpecification 包含几个辅助方法。为了处理 EssentialActions,您将使用call。由此产生的未来由其他更具体的助手处理。

    class MySpec extends PlaySpecification {
      ...
      val result1: Result = call(controllers.SomeController.action(), FakeRequest(...))
      status(of = result1) must equalTo (OK)
      ...
      val result2 = call(controllers.SomeController.action(), RequestHeader(...), "Body")
      status(of = result2) must equalTo (BAD_REQUEST)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 2017-10-01
      • 2018-09-10
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2021-05-09
      相关资源
      最近更新 更多