@sadikkhan02/test-utils

中文文档
1.0.0发布于 2026/11/02MITTypeScriptES Module零依赖

用于NotifyKit的确定性测试实用程序和适配器契约遵从套件

中文使用文档
文档目录8 节
  1. 安装
  2. 1. 适配器契约测试套件
  3. 示例:运行契约套件
  4. 什么 runAdapterContractTests 断言
  5. 2. 内存中模拟提供程序
  6. 3. 确定性测试装置
  7. 4. 安全的本地Redis帮手
  8. 许可证

@sadikkhan02/test-utils

官方测试工具和适配器契约测试框架 NotifyKit.

提供共享fixture、内存模拟提供程序、安全的本地Redis帮助程序和标准化的 适配器合同套件 (runAdapterContractTests),所有官方和社区提供程序适配器都需要。


安装

npm install --save-dev @sadikkhan02/test-utils vitest

1. 适配器契约测试套件

每个NotifyKit适配器(电子邮件、短信、推送)都必须符合标准的提供者接口和错误分类契约。使用 runAdapterContractTests,您可以在几分钟内验证自定义适配器。

示例:运行契约套件

import { describe, it, expect, vi } from 'vitest';
import { runAdapterContractTests } from '@sadikkhan02/test-utils';
import { MyEmailProvider, metadata } from '../src/index.js';

runAdapterContractTests({
  providerName: 'my-email',
  channel: 'email',
  metadata,
  createSuccessProvider: () => new MyEmailProvider({ mockTransport: true }),
  createAuthFailingProvider: () => new MyEmailProvider({ authError: true }),
  createNetworkFailingProvider: () => new MyEmailProvider({ networkError: true }),
  validOptions: {
    to: '[email protected]',
    from: '[email protected]',
    subject: 'Welcome',
    html: '<h1>Welcome!</h1>',
  },
  invalidOptions: {
    to: '',
    from: '',
    subject: '',
    html: '',
  },
  sampleSecret: 'my-secret-key-12345',
});

什么 runAdapterContractTests 断言

  1. 元数据的一致性:验证 metadata.name, metadata.channel,非空 requiredEnv.
  2. 提供者的身份:检查 provider.name === metadata.name 并确保规范的交付方法(sendEmail, sendSms,或者 sendPush)被实现。
  3. 交付成功:断言 { success: true, messageId: string } 成功交付。
  4. 永久故障分类:断言 { success: false, retryable: false } 与可操作的 error 关于身份验证/凭证失败。
  5. 暂态故障分类:断言 { success: false, retryable: true } 与可操作的 error 在网络/超时失败时。
  6. 畸形输入安全:断言提供程序返回 { success: false, retryable: false } 优雅地处理格式错误的输入,而不会抛出未处理的异常。
  7. 零凭证暴露验证原始秘密、承载令牌和私钥头在返回的错误消息中永远不会泄露。

2. 内存中模拟提供程序

在应用程序单元和集成测试中轻松模拟通知传递,无需网络I/O或凭据:

import {
  createMockEmailProvider,
  createMockSmsProvider,
  createMockPushProvider,
} from '@sadikkhan02/test-utils';

const mockEmail = createMockEmailProvider({ name: 'test-smtp' });
const mockSms = createMockSmsProvider({ name: 'test-sms' });

// Send a test email
await mockEmail.sendEmail({
  to: '[email protected]',
  from: '[email protected]',
  subject: 'Test',
  html: '<p>Test</p>',
});

// Inspect recorded calls
console.log(mockEmail.calls.length); // 1
console.log(mockEmail.calls[0].to); // '[email protected]'

// Simulate failure
mockEmail.setResult({ success: false, error: 'Rate limit exceeded', retryable: true });

3. 确定性测试装置

生成一致的、模式有效的接收者、作业和结果:

import {
  createTestRecipient,
  createTestNotificationJob,
  createMockProviderResult,
} from '@sadikkhan02/test-utils';

const emailRecipient = createTestRecipient('email', { email: '[email protected]' });
const smsRecipient = createTestRecipient('sms');
const pushRecipient = createTestRecipient('push');

const job = createTestNotificationJob('email', {
  templateId: 'order-confirmed',
  variables: { orderId: '123' },
});

4. 安全的本地Redis帮手

当使用真正的Redis运行集成测试时,防止对远程或生产实例的意外执行:

import { isSafeLocalRedisUrl, cleanupTestRedis } from '@sadikkhan02/test-utils';

// Fails closed if REDIS_URL is not 127.0.0.1 or localhost
await cleanupTestRedis();

许可证

麻省理工学院

版本与发布记录

@sadikkhan02/test-utils 共发布 2 个版本,首次发布于 2026/11/02;过去 12 个月发布了 2 个版本。

版本发布日期距今
1.0.0latest2026/11/021 天前
0.0.0-stage2026/11/021 天前

关于 @sadikkhan02/test-utils 的常见问题

@sadikkhan02/test-utils 是什么?

用于NotifyKit的确定性测试实用程序和适配器契约遵从套件

如何安装 @sadikkhan02/test-utils?

在项目目录运行 npm install @sadikkhan02/test-utils,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:vitest(>=1.0.0 || >=2.0.0 || >=3.0.0 || >=4.0.0 || >=5.0.0)、@sadikkhan02/notifykit(^1.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@sadikkhan02/test-utils 支持 TypeScript 吗?

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

@sadikkhan02/test-utils 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@sadikkhan02/test-utils 需要什么版本的 Node.js?

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

@sadikkhan02/test-utils 可以商用吗?

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

@sadikkhan02/test-utils 还在维护吗?

最新版本 1.0.0 发布于 2026/11/02(1 天前);至今共发布 2 个版本,其中过去 12 个月发布了 2 个;首次发布于 2026/11/02。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。