如何在NestJS中使用Wiremock NPM创建Wiremock stubs?
NestJS 项目使用指定Wiremock NPM包创建Stub实操
以下是该包实际可直接复用的基础用法,覆盖本地开发、单测/集成测试场景的stub创建需求:
前置准备
- 安装依赖:执行命令安装公司指定的wiremock包
npm install wiremock --save-dev - 项目配置调整:把所有需要mock的下游服务地址,替换为后续Wiremock实例启动的本地地址,避免请求打到真实服务。
基础实例启动
这个包是Wiremock standalone服务的Node封装,内置对应运行时不需要额外依赖Java环境,可以直接在NestJS的测试生命周期、本地启动脚本里初始化实例:
import { WireMock } from 'wiremock'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; // 示例:e2e测试中启动 let wiremock: WireMock; const MOCK_PORT = 9999; // 选一个未被占用的本地端口 beforeAll(async () => { // 初始化实例 wiremock = new WireMock(MOCK_PORT, 'localhost'); // 启动服务,可传自定义配置 await wiremock.start({ rootDir: './test/mock-stubs', // stub持久化存储路径,会自动创建 globalResponseHeaders: { 'Access-Control-Allow-Origin': '*' // 解决本地调试跨域 }, verbose: false // 关闭冗余日志 }); // 正常启动你的NestJS服务即可 const app = await NestFactory.create(AppModule); await app.init(); }); afterAll(async () => { // 测试结束必须关闭实例,避免端口残留占用 await wiremock.stop(); await app.close(); });
常用Stub创建示例
所有stub通过register方法注册,支持全量Wiremock的匹配规则:
- 基础GET请求固定返回
await wiremock.register({ request: { method: 'GET', urlPath: '/api/user/detail' }, response: { status: 200, headers: { 'Content-Type': 'application/json' }, jsonBody: { code: 0, data: { userId: 1001, userName: 'mock_user' } } } });
- 带参数匹配的请求(路径正则、查询参数、请求体)
await wiremock.register({ request: { method: 'GET', urlPathPattern: '/api/order/[0-9]+', // 正则匹配数字格式的订单id路径 queryParameters: { orderStatus: { equalTo: 'paid' } // 仅匹配orderStatus=paid的查询参数 } }, response: { status: 200, jsonBody: { code: 0, data: { orderStatus: 'paid', payTime: Date.now() } } } }); // POST请求匹配请求体字段 await wiremock.register({ request: { method: 'POST', url: '/api/pay/notify', bodyPatterns: [ { matchesJsonPath: '$.tradeNo', equalTo: 'T20240001' } ] }, response: { status: 200, jsonBody: { success: true } } });
- 异常场景模拟
// 模拟500服务错误 await wiremock.register({ request: { method: 'GET', url: '/api/server-error' }, response: { status: 500, jsonBody: { code: 500, msg: 'internal error' } } }); // 模拟接口超时,延迟3s返回,用于测试客户端超时逻辑 await wiremock.register({ request: { method: 'GET', url: '/api/timeout' }, response: { status: 200, fixedDelayMilliseconds: 3000, jsonBody: {} } });
常用辅助方法
- 清空所有已注册的stub:用例之间隔离用,避免stub互相干扰
await wiremock.resetAll(); - 校验mock接口的调用情况:验证业务逻辑是否正确发送请求
const requestLogs = await wiremock.getRequestsFor({ method: 'POST', url: '/api/pay/notify' }); // 断言回调接口被调用了1次 expect(requestLogs.length).toBe(1);
小提示:如果是本地开发长期用的mock服务,不需要每次在代码里register stub,可以直接在之前配置的
rootDir下的mappings文件夹里放符合Wiremock格式的json stub文件,实例启动时会自动加载,不用改代码。
内容的提问来源于stack exchange,提问作者yesha thakrar
相关产品推荐
相关产品推荐

