gpt4 book ai didi

scala - 测试 Play Controller 时模拟 ActionBuilder 的服务

转载 作者:行者123 更新时间:2023-12-02 03:35:52 25 4
gpt4 key购买 nike

我最近创建了一个 ActionBuilder,它根据请求本身发送的“授权” token 在请求中插入一个用户。我已经能够通过使用将其拆分为一个特征(即正在测试的元素)和一个对象的技术成功地对其进行单元测试,该对象所做的唯一事情就是扩展该特征。

trait AuthenticatedTrait extends ActionBuilder[AuthenticatedRequest] {
this: TokenServiceComponent =>
def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = {
[...]
}

object Authenticated extends AuthenticatedTrait with DefaultTokenServiceComponent with DefaultUserServiceComponent with TokenRepositorySlickComponent with UserRepositorySlickComponent

我还创建了一个使用此 Authenticated 的 Controller 行动:
trait ProfileController extends Controller {
def identity = Authenticated { implicit request =>
Ok(request.user.email)
}
}

object ProfileController extends ProfileController

手动测试这个 Controller 似乎工作正常,但我想添加一些自动化测试。这是问题开始的地方。

我想 mock ActionBuilder或它使用的服务,但作为 Authenticated被集成为一个对象,我看不到这样做的方法。

那么,您如何测试您的 ActionBuilder - 使用 Controller ?

最佳答案

我最终做的是创建一对特征,将 Action 构建器提供为可覆盖的方法。

trait Authenticated {
def authenticate: ActionBuilder[AuthenticatedRequest] = AuthenticatedAction
}

trait AuthenticatedMock extends Authenticated {
def user: User

object AuthenticatedActionMock extends ActionBuilder[AuthenticatedRequest] {
def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = {
block(new AuthenticatedRequest(user, request))
}
}

override def authenticate = AuthenticatedActionMock
}

然后 Controller 混合 Authenticated并使用 authenticate关于他们的行为。测试, AuthenticatedActionMock混入并提供用户。

关于scala - 测试 Play Controller 时模拟 ActionBuilder 的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com