@chat-adapters/测试
npm 软件包 :
@chat-adapter/tests
工厂、配对商和安装测试设施 聊天SDK 适配器和锅.
安装
pnpm add -D @chat-adapter/tests
这个软件包 chat 财务报告和审定财务报表 vitest 作为同伴的依赖性——它们应该已经在你的计划中了.
工厂
import {
createMockAdapter,
createMockChatInstance,
createMockState,
createTestMessage,
mockLogger,
} from "@chat-adapter/tests";
createMockAdapter(name?, overrides?)
返回 a Adapter 每种方法为: vi.fn() 和明智的违约。 过 overrides 以互换单个方法:
const adapter = createMockAdapter("slack", {
postMessage: vi.fn().mockResolvedValue({ id: "msg-7", raw: {} }),
});
createMockState()
回返a StateAdapter 由内存支持 Maps——订阅,锁定,KV,列表,并排队所有工作端到端. 包括a cache: Map<string, unknown> 直接检查.
createMockChatInstance(options?)
回返a ChatInstance 与每个 process* 处理器为 vi.fn()。用于适配器作者验证其适配器通过右钩发送来的事件.
const state = createMockState();
const chat = createMockChatInstance({ state });
await myAdapter.handleWebhook(req); // your adapter under test
expect(chat.processMessage).toHaveBeenCalledOnce();
createTestMessage(id, text, overrides?)
构建一个 Message aST已经装好了.
mockLogger 编号 : createMockLogger()
mockLogger 是一个共享的 Logger 用来进行不关心隔离的测试. createMockLogger() 返回每个调用的新代码.
匹配者
Vitest自定义匹配者覆盖了最常见的Chat SDK断言.
通过设置文件自动注册
// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
setupFiles: ["@chat-adapter/tests/setup"],
},
});
人工登记
import { matchers } from "@chat-adapter/tests/matchers";
expect.extend(matchers);
可用匹配者
| 匹配者 | 辅助 |
|---|---|
expect(adapter).toHavePosted(threadId, textPattern?) | adapter.postMessage 用于此线索( 和信件文本匹配) textPattern 如果给出) |
expect(adapter).toHaveEdited(threadId, messageId, textPattern?) | adapter.editMessage 已调用此信件( 和文本匹配 textPattern 如果给出) |
expect(adapter).toHaveDeleted(threadId, messageId) | adapter.deleteMessage 为了这个消息 |
expect(adapter).toHaveReactedWith(threadId, messageId, emoji) | adapter.addReaction 与emoji(弦或 EmojiValue.name(中文(简体) ) |
expect(adapter).toHaveStartedTyping(threadId) | adapter.startTyping 这个线程被调用 |
expect(adapter).toHavePostedToChannel(channelId, textPattern?) | adapter.postChannelMessage 被调用到此频道 |
expect(chat).toHaveDispatched(handler) | 这个名字 process* 模拟操作器 ChatInstance 被调用 |
expect(state).toBeSubscribedTo(threadId) | state.isSubscribed(threadId) 决定: true (同步-需求) await(中文(简体) ) |
expect(adapter).toHavePosted("slack:C1:t1", /hello/);
expect(adapter).toHaveEdited("slack:C1:t1", "msg-1", /updated/);
expect(adapter).toHaveDeleted("slack:C1:t1", "msg-1");
expect(adapter).toHaveReactedWith("slack:C1:t1", "msg-1", "thumbsup");
expect(adapter).toHaveStartedTyping("slack:C1:t1");
expect(adapter).toHavePostedToChannel("slack:C1");
expect(chat).toHaveDispatched("processMessage");
await expect(state).toBeSubscribedTo("slack:C1:t1");
文本版配对者(toHavePosted, (中文(简体) ), toHaveEdited, (中文(简体) ), toHavePostedToChannel)从 AdapterPostableMessage - 处理简单的弦, PostableMarkdown.markdown, (中文(简体) ), PostableRaw.raw,以及 PostableCard.fallbackText。 AST 形状信件(PostableAst和无牌 fallbackText 无法匹配文本 textPattern 检查 mock.calls 直接检查.
观众
- 瓶装作者 - 驱动模拟事件 通过你的处理者, 坚持出门呼叫.
- 适应作者 - 核实你
Adapter执行路线webhoks通过右侧ChatInstance.process*与正确的常态有效载荷相接.
适配器专用的帮助器(例如签名的Slack webhook构建器,Teams声称的构建器)住在每个适配器的自有设备中 /testing 子路径,不是在这个包里.
AI 编码代理
如果您使用OpenAI Codex, Claude Code, 或 Cursor 等AI编码代理, 在写入代码前安装 Chat SDK 技能, 使其了解 SDK API, 适配器模式, 以及项目常规 .
npx skills add vercel/chat
技术参考文献 node_modules/chat/docs,加上已发布的软件包中的适配器指南和启动模板.
您也可以安装 Vercel 插件 包括Chat SDK技术与专家代理、代理斜线指令
npx plugins add vercel/vercel-plugin
插件是可选的;单是技能就足以用Chat SDK来构建.
关于可代理阅读的文件,见 聊天- sdk.dev/llms.txt (页数索引)或 聊天- sdk.dev/llms- full.txt (全文).
许可证
麻省理工学院