【问题标题】:Play framework redirecting to other method returns 303 in test播放框架重定向到其他方法在测试中返回 303
【发布时间】:2016-12-15 14:40:04
【问题描述】:

我有 2 个端点:GET /users/meGET /users/:id。我想将第一个重定向到第二个,传递当前用户的 ID。所以我做了这个方法:

def getCurrentUser = SecuredAction { implicit request =>

  request.identity.id.map { currentUserId =>
    logger.info(s"Returning current user $currentUserId's profile")
    Redirect(routes.UserController.getUserById(currentUserId))
  }.getOrElse(InternalServerError)
}

这很好用,我没有收到邮递员的 303(我认为)。但是,以下测试失败,因为状态为 303:

val result = userController.getCurrentUser()(authenticatedRequest)
status(result) mustBe OK

这是测试框架的一些怪癖吗?我认为我使用的语法是用于静默内部重定向。我实际上并不想向客户端返回 303。

我该如何测试它,我编写的方法是否执行静默内部重定向?

【问题讨论】:

    标签: testing playframework playframework-2.5


    【解决方案1】:

    您的结果永远不会是 OK(相当于 http 状态 200),因为您返回的两个状态是 303(重定向)和 500(InternalServerError)。

    您为什么不想返回重定向状态?

    如果你想返回一个 OK 状态,你可以替换这一行:

    Redirect(routes.UserController.getUserById(currentUserId))
    

    通过getUserById的方法。

    【讨论】:

    • 我不想返回 303,因为我不想要额外的往返。此外,您建议的替换不起作用,因为getUserById 也是异步操作控制器,我收到错误Expression of type Object doesn't conform to expected type Result。我正在寻找一种将一个控制器方法透明地转发到另一个控制器方法而不在两者之间返回 303 的方法。你知道这是否可能吗?
    • 不,不使用root系统是不可能的,所以不返回303。我想告诉你的是直接使用UserController.getUserById使用的方法(如果没有使用方法,在服务中提取一个并使其由 UserController.getUserById 和 getCurrentUser 使用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多