JavaScript测试中动态修改Mock接口状态码的核心是控制响应对象的status字段,常用工具包括MSW、jest.mock和nock:MSW通过server.use()临时覆盖handler并引用可变status变量;jest.mock通过闭包变量控制fetch/axios返回状态;nock则用reply()配合times()模拟多次不同响应。

在 JavaScript 测试中动态修改 Mock 接口的状态码,核心是控制测试时返回的响应对象(尤其是 status 字段),而不是修改真实 HTTP 状态——因为 Mock 本身不走网络层。常用方式取决于你用的 Mock 工具,主流有 MSW(Mock Service Worker)、jest.mock()(针对 fetch 或 axios)、以及 nock(Node 环境)。下面分场景说明实用做法:
用 MSW 动态设置状态码
MSW 支持在 handler 中直接返回任意 status,并可在测试中通过 server.use() 临时覆盖已有 handler。
- 定义一个可变的 status 变量,在 mock handler 中引用它
- 每个 test case 前重置该变量,再调用
server.use()应用新规则 - 示例:
let mockStatus = 200;
server.use(
rest.get('/api/user', (req, res, ctx) => {
return res(ctx.status(mockStatus), ctx.json({ id: 1, name: 'Alice' }));
})
);
test('返回 404 时显示错误提示', async () => {
mockStatus = 404;
server.use(
rest.get('/api/user', (req, res, ctx) => res(ctx.status(mockStatus), ctx.json({})))
);
await renderApp();
expect(screen.getByText('请求失败')).toBeInTheDocument();
});
用 jest.mock 模拟 fetch 或 axios 时动态控制 status
如果你 mock 的是全局 fetch 或封装的请求函数(如 axios 实例),可在 mock 实现里读取测试上下文中的配置。
- 把期望的 status 存在闭包变量或模块级变量中
- 每次测试前重设该变量,再触发请求
- 注意:需确保 mock 在测试前已生效,且避免跨 test 污染(可用
beforeEach重置)
let mockResponseStatus = 200;
let mockResponseData = { id: 1 };
global.fetch = jest.fn(() =>
Promise.resolve({
ok: mockResponseStatus Promise.resolve(mockResponseData),
})
);
test('fetch 返回 500 时触发重试逻辑', () => {
mockResponseStatus = 500;
mockResponseData = {};
return fetch('/api/data').catch(err => {
expect(err.message).toContain('Network error');
});
});
用 nock(仅 Node.js 测试)动态匹配并响应不同状态
nock 支持按请求条件多次拦截同一 URL,并支持延迟、状态码、响应体等精细控制。
- 使用
nock(...).get(...).reply(statusCode, body)显式指定 - 可结合
times(n)控制某状态只生效 n 次 - 适合模拟“首次失败、重试成功”这类场景
test('第一次 503,第二次 200', async () => {
nock('https://api.example.com')
.get('/items')
.times(1)
.reply(503, { message: 'Service Unavailable' });
nock('https://api.example.com')
.get('/items')
.times(1)
.reply(200, [{ id: 1 }]);
const result = await fetchData(); // 内部会重试
expect(result.length).toBe(1);
});
小技巧:统一管理 Mock 状态,避免散落
为提升可维护性,建议把 mock 状态抽成测试工具函数或自定义 hook:
- 封装
setupMockApi(url, { status, data, delay }) - 在
beforeEach中统一清理所有 mock(如jest.clearAllMocks()或server.resetHandlers()) - 对复杂流程(如登录态 + 权限 + 错误码组合),用对象描述预期行为,再生成对应 mock
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











