# @btravstack/testing 中文文档

规范地址：https://npmcn.com/package/%40btravstack/testing/

版本：0\.58\.0
npm 元数据更新时间：2026-11-07T21:11:58.835Z
中文译文更新时间：2026-11-08T17:42:43.829Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40btravstack/testing
原文对照：https://npmcn.com/package/%40btravstack/testing/?lang=original
项目主页：https://github.com/btravstack/btravstack#readme
源码仓库：https://github.com/btravstack/btravstack

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：51.7 kB，11 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=22
- 运行依赖：0 个
- peer 依赖：jose ^6，unthrown ^5\.0\.0，@btravstack/di ^0\.58\.0，@btravstack/core ^0\.58\.0，@btravstack/config ^0\.58\.0
- 首次发布：2026-08-25T16:16:34.880Z
- 最新版本发布：2026-11-07T21:11:58.509Z
- 近 30 天下载量：8627（2026-10-09 至 2026-11-07，npm 官方下载统计）
- 已发布版本数：62（近 12 个月 62 个）

## 中文简介

测试应用程序@ btravstack/ 核心靴: 模拟运行时间、 假时钟、 停止启动的靴子固定器、 并启动运行图

## 安装

```sh
npm install @btravstack/testing
```

也可以使用：`pnpm add @btravstack/testing`、`yarn add @btravstack/testing`、`bun add @btravstack/testing`

## README

# @btravstack/测试

> 测试应用程序 [`@btravstack/core`](https://npmcn.com/package/%40btravstack/core) 脚 A 类 `test.extend` 用测试默认启动模块并停止每个应用程序的固定图 当测试结束,一个水龙头,它把服务带回来 图表 模拟运行时间 随需要移动的时钟——方式 `@nestjs/testing` {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}然后远离内核 所以是制作 捆绑从不拉出假货.

📖 **[文档](https://btravstack.github.io/btravstack/how-to/test-an-application)** • 妇女 [参考文献](https://btravstack.github.io/btravstack/reference/testing) • 妇女 [API 参考](https://btravstack.github.io/btravstack/api/testing/)

```sh
pnpm add -D @btravstack/testing @btravstack/core @btravstack/config @btravstack/di unthrown
```

`@btravstack/core`, (中文(简体) ), `@btravstack/config`, (中文(简体) ), `@btravstack/di` 财务报告和审定财务报表 `unthrown` 为: 端点依赖性; 软件包不依赖其他任何条件—— 甚至 `vitest`数字 : `bootFixture` 是一个平地 `(ctx, use) => Promise<void>` 函数,即 vitest 的固定协议,所以不需要导入来将其交给 `test.extend`。 。 。 . `jose` 是一个 **选项** 后端对等 `@btravstack/testing/jwt` 子路径 - 见下文——因此,一个从未进口过它的消费者不会安装任何额外的设备. 节点 `>=22`。 。 。 .

## 启动的应用程序作为固定器

```ts
import { bootFixture, tapped, type Boot } from "@btravstack/testing";
import { expect, test } from "vitest";

const it = test.extend<{ boot: Boot }>({
  boot: bootFixture({ env: { PORT: "0", HOST: "127.0.0.1" } }),
});

it("serves on an ephemeral port", async ({ boot }) => {
  const app = boot(OrderApi);

  await expect(app.runtimeInfo()).toBeOkWith(
    expect.objectContaining({ port: expect.any(Number) }),
  );
});

it("holds the very logger the use cases write to", async ({ boot }) => {
  const tap = tapped(OrderApi, [Logger]);
  await boot(tap.module).runtimeInfo();

  const [logger] = tap.services();
  expect(logger.lines()).toEqual([]);
});
```

`boot` 实值 `start` 同样的签名 同样的签名 编译时间门, 减 `signals` ——永远关闭——与 `probes: false` 除非 呼叫要求一个港口, `preDrainDelayMs: 0` 和无声 `onEvent` 作为 默认值,每个值都高于固定值 `defaults` 每一个电话. 当测试结束时,每个开始的应用程序都会停止, 在每一个出口路径上, a (a) 未包括的主张 **`Defect`** 打开 `exited` 测试甚至失败 当测试从不看它, 而一个模型 `Err` - 启动失败 检验标准可能坚持——通过.

`tapped(module, [Port, …])` 组成另一个提供者周围 `module`, (中文(简体) ), 取决于这些港口,并记住它用什么建造的: `services()` 解答运行中的图建起后所保存的示例 `runtimeInfo()` 决心,说,和扔前。 大门拒绝开口 `module` 不导出.

## 飞来飞去

-   **`bootFixture(defaults?)`** 上面的固定装置; `Boot` 财务报告和审定财务报表 `BootDefaults` 是它的种类.
-   **`tapped(module, ports)`** → `{ module, services() }` - 阅读服务 被启动的申请.
-   **`testRuntime(name?, { unit? })`** 编号 : **`TestRuntimePort`** 记忆 `Runtime` 与 `submit()` 在一个排水沟对开的单位, `host()` 改为 到达 `RuntimeHost` 上一个开始,一个 `module` 那个 在起步者愿意的地方提供; `unit` 每个提交单元 没有种子的叉子 在它工作开始之前 那个模块需要什么 `module`属于自己的,所以 `start` 而不是第一个 `submit()` 失败.
-   **`overridden(module, [providers])`** - 将指定供应商替换为 **真实** 组成根,而不是维持平行测试根 旁边 换一个 **提供者**的子系统: 供货商的兄弟姐妹还在构筑,所以交换一个完整的适配器堆栈 仍是一个不同的模块 由它组成。 端口的覆盖 树停止提供是一个 `WiringDefect` ("无所可覆"),即 何以能使测试根不悄悄地从真根上飘去 漂移,四个手持的平行根 已经在这里产生. `overridden(module, [providers], { unit: { user: [providers] } })` 达到 在单元单元内,根按种类与同个漂移门相连 脚.
-   **`createFakeClock(start?)`** a 包括: `Clock` 页:1 `StartOptions.clock` 谁 时间只移动到 `advance(ms)`。 。 。 .

拆分规则:a `Defect` 打开 `exited` 测试失败, 一个模型 `Err` 已经 没有.

## 一个本地的JWT发行商,在自己的子路径上

```ts
import { localIssuer } from "@btravstack/testing/jwt";

const issuer = await localIssuer({
  issuer: "https://issuer.test",
  audience: "orders-api",
}).get();

const token = await issuer.sign({ sub: "u-1" }).get();
// verify `token` against `issuer.jwks`, the same way a real JWKS would be
await issuer.close();
```

`sign` 接受字符串或只读的受众列表,包括故意宽泛 用于接受政策拒绝测试的标志.

`@btravstack/testing/jwt`是因为 `localIssuer(options)` 薄荷生成密钥 双对, a `node:http` 听众以 JWKS 身份回答其公钥 `sign(claims?, options?)` 关闭私人密钥 —— 一个真实的获取 一个真正的JWKS文档, 用于测试, 想要验证库自己的 行为而不是双倍. `sign`是因为 `expiresIn: false` 薄荷一个符号 没有 `exp` ,而密钥为RS256。 该子路径需要"共同JS"下的"22.12"节点- `jose` 实值 只有无害环境管理,所以CJS建设 `require("jose")` 取决于 `require(esm)`· ; 无害环境管理的消费者,以及从未进口该次路径的任何人,不受影响.

## 许可证

[麻省理工学院](https://npmcn.com/package/%40btravstack/testing/LICENSE) 贝诺伊特旅行社

## 常见问题

### @btravstack/testing 是什么？

测试应用程序@ btravstack/ 核心靴: 模拟运行时间、 假时钟、 停止启动的靴子固定器、 并启动运行图

### 如何安装 @btravstack/testing？

在项目目录运行 npm install @btravstack/testing，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：unthrown（^5\.0\.0）、@btravstack/di（^0\.58\.0）、@btravstack/core（^0\.58\.0）、@btravstack/config（^0\.58\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @btravstack/testing 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @btravstack/testing 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @btravstack/testing 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=22。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @btravstack/testing 可以商用吗？

@btravstack/testing 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @btravstack/testing 的下载量有多少？

根据 npm 官方下载统计，@btravstack/testing 在 2026/10/09 – 2026/11/07 这 30 天内被下载 8,627 次，日均约 288 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @btravstack/testing 还在维护吗？

最新版本 0\.58\.0 发布于 2026/11/08（今天）；至今共发布 62 个版本，其中过去 12 个月发布了 62 个；首次发布于 2026/08/26。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

