ES6 Class 编写的组件是纯 JavaScript 类,测试需实例化类、调用方法并断言结果,覆盖正常流程与边界情况(如空栈操作),支持 Jest/Vitest 等工具,继承类和静态成员按对应方式调用验证。

用 ES6 Class 编写的组件本身不是 React 或 Vue 组件,而是纯 JavaScript 类(比如自定义数据结构、工具类、业务逻辑类)。所以“编写组件测试用例”在这里实际指:对基于 class 定义的 JS 类(如 MyStack、Book、Person 等)编写单元测试,验证其行为是否符合预期。
这类测试不依赖框架,通常用 Jest、Vitest 或原生 Node.js assert 模块即可。核心是:实例化类 → 调用方法 → 断言返回值或状态变化。
明确被测类的接口
先看清类暴露了哪些可调用方法和预期行为。例如:
class MyStack {
constructor() {
this.items = [];
}
push(item) {
this.items.push(item);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}关键接口:push()、pop()、peek()、isEmpty()。测试需覆盖正常流程与边界情况(如空栈调 pop)。
用 Jest 写基础测试用例
Jest 是最常用的选择,开箱即支持 ES6 module 和异步断言。
- 创建
MyStack.test.js - 使用
describe分组,it/test描述单个场景 - 每个测试应独立:新建实例,避免状态污染
const MyStack = require('./MyStack'); // 或 import { MyStack } from './MyStack';
describe('MyStack', () => {
it('pushes and pops correctly', () => {
const s = new MyStack();
s.push(9);
s.push(8);
s.push(7);
expect(s.pop()).toBe(7);
expect(s.pop()).toBe(8);
});
it('returns top element with peek()', () => {
const s = new MyStack();
s.push(10);
s.push(20);
expect(s.peek()).toBe(20);
});
it('reports empty status accurately', () => {
const s = new MyStack();
expect(s.isEmpty()).toBe(true);
s.push(1);
expect(s.isEmpty()).toBe(false);
s.pop();
expect(s.isEmpty()).toBe(true);
});
});注意:不要在多个 it 中复用同一个实例,否则状态会残留。
覆盖边界与异常情况
Class 方法可能隐含副作用或错误路径,需主动验证:
- 空栈调
pop()或peek()应返回undefined(或按设计抛错) - 构造函数接收非法参数时是否健壮(如
new MyStack('invalid'))
it('peek() returns undefined on empty stack', () => {
const s = new MyStack();
expect(s.peek()).toBeUndefined();
});
it('pop() returns undefined on empty stack', () => {
const s = new MyStack();
expect(s.pop()).toBeUndefined();
});若希望严格报错,可在 pop/peek 中加判断并 throw new Error(),测试就改用 expect(() => s.peek()).toThrow()。
测试继承类与静态成员
如果类有 extends 或 static 方法,测试方式一致,只是调用路径不同:
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() {
return `${this.name} barks`;
}
}
// 静态方法
Dog.info = () => 'Dog class';
// 测试继承行为
test('Dog inherits and adds behavior', () => {
const dog = new Dog('Leo', 'Golden');
expect(dog.name).toBe('Leo');
expect(dog.breed).toBe('Golden');
expect(dog.bark()).toBe('Leo barks');
expect(Dog.info()).toBe('Dog class');
});静态方法直接通过类名调用;实例方法仍需 new 实例后调用。
不复杂但容易忽略


















