You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:57:52