Node.js环境下如何使用supertest测试req.query查询参数?
问题根因与解决方法
你使用.query()传参的写法本身是Supertest官方推荐的标准写法,出现匹配错误、参数不生效的问题是两个常见错误导致的:
1. 链式调用顺序错误
Supertest的链式调用中,所有请求配置类方法(.set()、.query()、.send()等)必须放在所有断言类方法(.expect())之前,你现有代码中.expect(200)写在了.query()前面,会导致请求在query参数还没挂载时就已经发送,相当于发送了无参数的GET /transfers/pending请求,自然无法匹配预期逻辑。
2. 路由匹配顺序错误
Express/Koa等Node服务端框架都是按路由定义的先后顺序执行匹配,如果你把动态参数路由(比如/transfers/:id)定义在了静态路由/transfers/pending之前,请求会优先命中动态路由,把pending当做id参数的值,触发其他端点的逻辑。
修正后的可用代码
it('GET normal pending transfer with receiverId', (done) => { supertest(app) .get('/transfers/pending') // 所有请求配置放在最前面 .set('Accept', 'application/json') .query({ senderId: clientSenderId, }) // 所有断言放在请求配置之后 .expect(200) .expect('Content-Type', 'application/json; charset=utf-8') .then((res) => { console.log('res.body', res.body); done(); }) .catch(done); });
额外说明
你尝试的直接拼接URL的写法本身也可以生效,但是你错误使用了单引号包裹模板字符串,导致${clientSenderId}没有被解析为变量,而是作为纯字符串传递。如果要用拼接写法,需要把单引号替换为反引号:
.get(`/transfers/pending?senderId=${clientSenderId}`)
如果要排查请求是否符合预期,可以在链式调用中打印实际请求路径确认:
.end((err, res) => { console.log('实际请求路径:', res.req.path) done(err) })
内容的提问来源于stack exchange,提问作者dokichan
相关产品推荐
相关产品推荐

