Ktor中testApplication获取Scope调用handleRequest的方法求助
Ktor testApplication 调用 handleRequest 的解决方案
在新版 Ktor 的 testApplication 中,你不需要额外获取 Scope,直接在 testApplication 的代码块内就能调用 handleRequest——因为 testApplication 的 lambda 接收者就是 TestApplicationEngine 实例,它自带这个方法。
修改后的测试代码示例
import io.ktor.http.HttpMethod import io.ktor.http.HttpStatusCode import io.ktor.server.testing.testApplication import org.junit.Test import kotlin.test.assertEquals @Test fun `Create user, no body attached, responds with BadRequest`() = testApplication { // 配置待测试的路由 application { install(Routing) { createUserRoute(userRepository) // 这里的userRepository应为测试替身(比如Mock实例) } } // 发送请求并验证响应 handleRequest(HttpMethod.Post, "/api/user/create") { // 不设置请求体,模拟无body的场景 }.apply { // 验证响应状态码 assertEquals(HttpStatusCode.BadRequest, response.status()) // 解析并验证响应内容(假设使用Jackson序列化) val apiResponse = response.content?.let { com.fasterxml.jackson.module.kotlin.jacksonObjectMapper() .readValue(it, com.PapperSeller.data.responses.BasicApiResponse::class.java) } assertEquals(com.PapperSeller.util.ApiResponseMessages.NO_USER_REGISTERED, apiResponse?.message) assertEquals(false, apiResponse?.successful) } }
额外说明
- 如果需要设置请求头或请求体,直接在
handleRequest的 lambda 里添加即可,示例:handleRequest(HttpMethod.Post, "/api/user/create") { addHeader("Content-Type", "application/json") setBody("""{"email":"test@example.com","username":"test","password":"123456"}""") } - 确保
userRepository是测试专用的模拟实现,避免依赖真实数据库,保证测试的独立性和执行速度。
内容的提问来源于stack exchange,提问作者jens
相关产品推荐
相关产品推荐

