es6 class构建可测试后端逻辑的核心是职责分离、依赖可替换、行为可验证:通过构造函数注入依赖实现解耦,使用实例方法而非静态方法保障隔离,返回结构化结果便于断言,并天然适配jest等测试工具。

用 ES6 Class 构建可测试的后端逻辑,核心在于**职责分离、依赖可替换、行为可验证**。不是把所有代码塞进一个类里,而是让类专注表达业务意图,同时天然支持模拟(mock)和隔离测试。
明确类的边界:只封装领域行为,不耦合外部环境
后端逻辑常涉及数据库、HTTP 客户端、缓存等。这些不该写死在类内部,而应通过构造函数注入——这样测试时就能传入假对象(stub/mock),避免真实 I/O。
- 类只定义“做什么”,比如
UserValidator负责校验邮箱格式、密码强度;OrderProcessor负责扣库存、生成订单号、发通知 - 具体“怎么做”(如调用 PostgreSQL 查询、发 Slack 消息)由注入的依赖实现,类本身不 import
pg或node-fetch - 示例:
class EmailService { constructor(client) { this.client = client; } send(to, template) { return this.client.post('/send', { to, template }); } }—— 测试时传入一个返回 Promise.resolve() 的 mock client 即可
用实例方法而非静态方法,保障可实例化与状态隔离
静态方法难以被继承、无法被 spy/mock,且隐含全局状态风险。可测试的类应基于实例,每个测试用例可创建独立实例,互不干扰。
- 避免
static createOrder()这类设计;改用new OrderService(db, notifier).create(...) - 构造函数接收依赖,实例方法执行业务流程,返回值明确(如 Promise
或 Error) - 若需工具函数(如日期格式化),单独抽成纯函数模块,不挂载在类上
暴露关键状态或结果,便于断言
测试不是只看是否抛错,更要验证中间状态或输出结构。合理设计 getter 或返回结构化对象,让断言有据可依。
- 例如
OrderProcessor.process()返回{ order, events: ['inventory_deducted', 'notification_sent'] },测试可断言 events 是否包含预期事件 - 对内部状态敏感的场景(如重试计数、缓存命中标识),提供只读 getter(如
get retryCount()),不开放 setter - 避免“黑盒式” void 方法;即使无业务返回值,也考虑返回操作摘要对象,利于测试观察
配合 Jest 等框架,轻松覆盖典型路径
ES6 Class 天然适配现代测试工具。构造函数注入让 mock 成本极低;async/await 支持让异步逻辑测试清晰直接。
- 单元测试中,用
jest.mock('...')或手动构造 mock 依赖,快速验证 happy path、error path、边界条件 - 利用
jest.spyOn(instance, 'methodName')验证方法是否被正确调用及参数是否准确 - 结合
async/await和expect(...).resolves或.rejects,一行断言异步行为











