测试if语句时部分代码未覆盖,无法达标求解决方法
解决代码分支未被测试覆盖的问题
嘿,我来帮你搞定这个代码覆盖率的问题!你遇到的是三个if分支没被测试命中的情况,咱们一个个拆解,把每个场景都覆盖到:
未覆盖的分支分析
你的代码里有三个需要覆盖的分支场景:
- 外层
if (user)的假分支:当user为null或undefined时 - 内层
if (user.token)的假分支:user存在,但user.token不存在(比如null/undefined/空值) - 内层
if (user.account)的假分支:user存在,但user.account不存在(或者user.account.id缺失)
测试用例编写方案
假设你用的是Jest这类前端测试框架,你可以通过模拟getState函数的返回值,构造不同的user场景来覆盖所有分支:
1. 覆盖if (user)的假分支
模拟getState('user')返回null或undefined,验证axios的请求头不会被修改:
test('当user不存在时,不设置任何请求头', () => { // 模拟getState返回null jest.mock('./your-state-module', () => ({ getState: jest.fn().mockReturnValue(null) })); // 执行你的代码 require('./your-code-file'); // 验证请求头没有被设置 expect(axios.defaults.headers.common.Authorization).toBeUndefined(); expect(axios.defaults.headers.common['X-Account-Id']).toBeUndefined(); });
2. 覆盖if (user.token)的假分支
构造存在user但没有token的场景:
test('当user存在但无token时,只设置X-Account-Id(如果有account)', () => { jest.mock('./your-state-module', () => ({ getState: jest.fn().mockReturnValue({ account: { id: '123' } // 不包含token属性 }) })); require('./your-code-file'); expect(axios.defaults.headers.common.Authorization).toBeUndefined(); expect(axios.defaults.headers.common['X-Account-Id']).toBe('123'); });
3. 覆盖if (user.account)的假分支
构造存在user但没有account的场景:
test('当user存在但无account时,只设置Authorization(如果有token)', () => { jest.mock('./your-state-module', () => ({ getState: jest.fn().mockReturnValue({ token: 'abc123' // 不包含account属性 }) })); require('./your-code-file'); expect(axios.defaults.headers.common.Authorization).toBe('Bearer abc123'); expect(axios.defaults.headers.common['X-Account-Id']).toBeUndefined(); });
4. 额外:覆盖所有分支都命中的场景
别忘了测试user同时有token和account的情况,确保两个请求头都被正确设置:
test('当user同时有token和account时,设置两个请求头', () => { jest.mock('./your-state-module', () => ({ getState: jest.fn().mockReturnValue({ token: 'abc123', account: { id: '123' } }) })); require('./your-code-file'); expect(axios.defaults.headers.common.Authorization).toBe('Bearer abc123'); expect(axios.defaults.headers.common['X-Account-Id']).toBe('123'); });
可选:代码优化建议
如果想让代码更简洁,同时保持分支清晰,可以用可选链操作符简化判断,测试逻辑也不会变复杂:
const user = getState('user'); if (user) { if (user.token) { axios.defaults.headers.common.Authorization = `Bearer ${user.token}`; } if (user.account?.id) { // 用可选链判断account.id是否存在 axios.defaults.headers.common['X-Account-Id'] = user.account.id; } }
写完这些测试用例后,你的三个if分支应该就能全部被覆盖啦!
内容的提问来源于stack exchange,提问作者Sean Delaney
相关产品推荐
相关产品推荐

