使用Supertest与Jest时,无匹配函数的expect调用来源疑问
解惑:Supertest的
.expect vs Jest的expect 没错,你代码里的.expect(200)完全属于Supertest,和Jest的expect是两个独立的工具,功能和用法都不一样。
1. Supertest的.expect是什么?
它是Supertest专门为HTTP请求测试设计的链式断言方法,直接绑定在请求对象上:
.expect(200):直接校验HTTP响应的状态码是否为200.expect("Content-Type", /application\/json/):校验响应头的Content-Type是否匹配指定的正则表达式- 它内部会自动处理断言逻辑,一旦校验失败就会抛出错误,不需要额外的匹配器。
2. 和Jest的expect的区别
Jest的expect是全局通用断言函数,必须搭配匹配器(比如.toBe()、.toHaveLength())才能完成断言,它可以用来校验任何值,不局限于HTTP测试场景。比如:
expect(200).toBe(200); // Jest的断言,需要匹配器 expect([1,2,3]).toHaveLength(3); // 同样是Jest的断言
3. 为什么两者能一起工作?
你写的测试是在Jest的test块里执行的,当Supertest的.expect校验失败时,会抛出一个异常,Jest会捕获这个异常并标记测试失败;如果所有Supertest的.expect都通过,Jest就会认为整个测试用例通过。
你也可以混合使用两者,比如先拿到响应,再用Jest的断言做更复杂的校验:
test("notes data matches expected", async () => { const response = await api.get("/api/notes"); // 用Jest的expect做复杂断言 expect(response.body[0].content).toBe("First note"); });
内容的提问来源于stack exchange,提问作者bugsyb
相关产品推荐
相关产品推荐

