@btravstack/测试
测试应用程序
@btravstack/core脚 A 类test.extend用测试默认启动模块并停止每个应用程序的固定图 当测试结束,一个水龙头,它把服务带回来 图表 模拟运行时间 随需要移动的时钟——方式@nestjs/testing{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}然后远离内核 所以是制作 捆绑从不拉出假货.
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。 。 。 .
启动的应用程序作为固定器
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页:1StartOptions.clock谁 时间只移动到advance(ms)。 。 。 .
拆分规则:a Defect 打开 exited 测试失败, 一个模型 Err 已经
没有.
一个本地的JWT发行商,在自己的子路径上
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)· ;
无害环境管理的消费者,以及从未进口该次路径的任何人,不受影响.
许可证
麻省理工学院 贝诺伊特旅行社