电子说
在本地开发和测试期间,经常会遇到您的应用依赖于远程 API 的情况。网络问题、速率限制,甚至 API 提供商的停机都可能阻碍您的进度。这会严重影响您的工作效率并使测试更具挑战性。这就是 WireMock 发挥作用的地方。
WireMock 是一个开源工具,可以帮助开发人员创建模拟真实 API 行为的模拟服务器,为开发和测试提供受控环境。
假设您有一个 API 和一个前端应用,并且想要测试前端如何与 API 交互。使用 WireMock,您可以设置一个模拟服务器来模拟 API 的响应,这样您就可以在不依赖实际 API 的情况下测试前端行为。当 API 仍在开发中或您想要在不影响实际 API 的情况下测试不同场景时,这会特别有用。WireMock 支持 HTTP 和 HTTPS 协议,可以模拟各种响应场景,包括延迟、错误和不同的 HTTP 状态代码。
在本指南中,您将学习如何:
使用 Docker 启动 WireMock 容器。
在本地开发中使用模拟数据,无需依赖外部 API
在生产中使用 Live API 从 AccuWeather 获取实时天气数据。
将 WireMock 与 Docker 结合使用
WireMock 的官方 Docker 镜像提供了一种部署和管理 WireMock 实例的便捷方式。WireMock 适用于各种 CPU 架构,包括 amd64、armv7 和 armv8,确保与不同设备和平台兼容。您可以在 WireMock 文档站点上了解有关 WireMock 独立版的更多信息。
先决条件
遵循本操作指南需要满足以下先决条件:
Docker 桌面
启动 WireMock
使用以下步骤启动 WireMock 的快速演示:
在本地克隆 GitHub 存储库。
$ git clone https://github.com/dockersamples/wiremock-node-docker
导航到wiremock-endpoint目录
$ cd wiremock-node-docker/
WireMock 充当后端与之通信以检索数据的模拟 API。已在映射目录中为您创建了模拟 API 响应。
通过在克隆的项目目录的根目录下运行以下命令来启动 Compose 堆栈
$ docker compose up -d
片刻之后,应用程序将启动并运行。
您可以通过选择容器来检查日志wiremock-node-docker:
测试 Mock API。
$ curl http://localhost:8080/api/v1/getWeather?city=Bengaluru
它将返回带有模拟数据的以下预设响应:
{"city":"Bengaluru","temperature":27.1,"conditions":"Mostly cloudy","forecasts":[{"date":"2024-09-02T07:00:00+05:30","temperature":83,"conditions":"Partly sunny w/ t-storms"},{"date":"2024-09-03T07:00:00+05:30","temperature":83,"conditions":"Thunderstorms"},{"date":"2024-09-04T07:00:00+05:30","temperature":83,"conditions":"Intermittent clouds"},{"date":"2024-09-05T07:00:00+05:30","temperature":82,"conditions":"Dreary"},{"date":"2024-09-06T07:00:00+05:30","temperature":82,"conditions":"Dreary"}]}
使用 WireMock,您可以使用映射文件定义预设响应。对于此请求,模拟数据在 JSON 文件中定义 wiremock-endpoint/mappings/getWeather/getWeatherBengaluru.json。
有关存根预制响应的更多信息,请参阅 WireMock 文档。
在开发中使用 WireMock
现在您已经尝试了 WireMock,让我们在开发和测试中使用它。在此示例中,您将使用具有 Node.js 后端的示例应用程序。此应用程序堆栈具有以下配置:
本地开发环境:Node.js 后端和 WireMock 运行的环境。
Node.js Backend:代表处理 HTTP 请求的后端应用程序。
外部 AccuWeather API:获取实时天气数据的真实 API。
WireMock:测试期间模拟 API 响应的模拟服务器。它作为 Docker 容器运行。
展示 WireMock 开发中的架构图
在开发中,Node.js 后端向 WireMock 发送请求,而不是实际的 AccuWeather API。
在生产中,它直接连接到实时 AccuWeather API 获取真实数据。
在本地开发中使用模拟数据
让我们设置一个 Node 应用程序来向 WireMock 容器而不是实际的 AccuWeather API 发送请求。
先决条件
安装 Node.js 和 npm
确保 WireMock 容器已启动并正在运行(请参阅 启动 Wiremock
按照以下步骤设置非容器化的 Node 应用程序:
导航到accuweather-api目录
确保您位于package.json文件所在的目录中。
设置环境变量。
打开目录.env下的文件accuweather-api/。删除旧条目并确保它只包含以下一行。
API_ENDPOINT_BASE=http://localhost:8080
这将告诉你的 Node.js 应用程序使用 WireMock 服务器进行 API 调用。
检查应用程序入口点
该应用程序的主文件是index.js,位于accuweather-api/src/api目录中。
此文件启动getWeather.js模块,这对您的 Node.js 应用程序至关重要。它使用dotenv包从文件中加载环境变量.env。
根据 的值API_ENDPOINT_BASE,应用程序将请求路由到 WireMock 服务器 ( http://localhost:8080) 或 AccuWeather API。在此设置中,它使用 WireMock 服务器。
代码确保ACCUWEATHER_API_KEY仅当应用程序未使用 WireMock 时才需要,从而提高效率并避免错误。
启动 Node 服务器
在启动 Node 服务器之前,请通过运行确保已经安装了 package.json 文件中列出的节点包npm install。
npm install
npm run start
您应该看到以下输出:
> express-api-starter@1.2.0 start
> node src/index.js
API_ENDPOINT_BASE: http://localhost:8080
..
Listening: http://localhost:5001
输出表明您的 Node 应用程序已成功启动。保持此终端窗口打开。
测试模拟 API
打开一个新的终端窗口并运行以下命令来测试模拟的 API:
$ curl "http://localhost:5001/api/v1/getWeather?city=Bengaluru"
您应该看到以下输出:
{"city":"Bengaluru","temperature":27.1,"conditions":"Mostly cloudy","forecasts":[{"date":"2024-09-02T07:00:00+05:30","temperature":83,"conditions":"Partly sunny w/ t-storms"},{"date":"2024-09-03T07:00:00+05:30","temperature":83,"conditions":"Thunderstorms"},{"date":"2024-09-04T07:00:00+05:30","temperature":83,"conditions":"Intermittent clouds"},{"date":"2024-09-05T07:00:00+05:30","temperature":82,"conditions":"Dreary"},{"date":"2024-09-06T07:00:00+05:30","temperature":82,"conditions":"Dreary"}]}%
这表明你的 Node.js 应用程序现在已成功将请求路由到 WireMock 容器并接收模拟响应
您可能已经注意到,您正在尝试使用http://localhost:5001URL 而不是 port 8080。这是因为您的 Node.js 应用程序正在 port 上运行5001,并且它将请求路由到正在监听 port 的 WireMock 容器8080。
显示在 Docker Desktop 上运行的 WireMock 容器的日志的图表
显示在 Docker Desktop 上运行的 WireMock 容器的图表
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !