我有以下路线:
get("/user") {
val principal: UserIdPrincipal = call.principal()
?: return@get call.respond(HttpStatusCode.Unauthorized)
val user = userService.findUserForId(principal.name.toLong())
?: return@get call.respond(HttpStatusCode.Unauthorized)
val userResponse = UserResponse(username = user.username)
call.respond(userResponse)
}我不想测试身份验证是否适用于我的每一个路由,所以我想模拟call.principal()。因为它是一个内联扩展函数,所以不容易被模仿。有什么办法可以解决这个问题吗?
发布于 2021-10-11 15:19:50
如果您可以在测试中更改Authentication插件的配置,那么您就可以注册一个提供者,在AuthenticationPipeline.RequestAuthentication阶段拦截它的管道,以获得对身份验证上下文的访问,并最终分配新的主体。下面是一个示例:
import io.ktor.application.*
import io.ktor.auth.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main() {
val server = embeddedServer(Netty, port = 8080) {
install(Authentication) {
provider {
pipeline.intercept(AuthenticationPipeline.RequestAuthentication) { context ->
context.principal(UserIdPrincipal("principal"))
}
}
}
routing {
authenticate {
get("/user") {
val principal: UserIdPrincipal = call.principal()!!
call.respond(principal.name)
}
}
}
}
server.start(wait = true)
}https://stackoverflow.com/questions/69492619
复制相似问题