在Jest测试中是否需要模拟内置函数startsWith?
结论:不需要单独模拟startsWith内置函数
原因:
- 真实场景中,
req.headers.authorization是字符串类型(比如"Bearer xxx"),字符串本身就自带原生的startsWith方法,这个方法是JS标准内置的,行为完全可靠,不需要我们额外模拟。 - 我们要测试的是自己的鉴权逻辑:当authorization符合要求(带Bearer前缀)、不符合要求(不带前缀/不存在)时,代码是否返回正确响应。没必要去验证JS原生方法的正确性。
你当前模拟代码的问题:
你把authorization模拟成了一个对象,还给它加了mock的startsWith方法,这和真实请求的结构完全不符——真实请求里authorization是字符串,不是对象,这种模拟会导致原鉴权逻辑的判断出错。
正确的模拟写法:
直接给authorization赋值成符合真实场景的字符串即可:
// 模拟带合法Bearer token的请求 const mockValidRequest = () => { return { headers: { authorization: "Bearer valid-token-here" }, }; }; // 模拟不带Bearer前缀的非法请求 const mockInvalidRequest = () => { return { headers: { authorization: "InvalidTokenWithoutBearer" }, }; }; // 模拟完全没有authorization的请求 const mockMissingAuthRequest = () => { return { headers: {} }; };
这样就能准确测试你的鉴权逻辑:比如用mockInvalidRequest时,代码应该返回403错误;用mockValidRequest时,应该跳过这个错误分支。
内容的提问来源于stack exchange,提问作者robert_45
相关产品推荐
相关产品推荐

