定制断言
Jest 提供了灵活的断言机制,允许您创建自定义断言以满足特定需求。通过使用 expect.extend()
方法,您可以扩展 Jest 的内置断言库,例如:
expect.extend({
toBeStringEnum: (received) => {
const pass = typeof received === "string" && Object.values(MyEnum).includes(received);
return {
pass,
message: () => `Expected ${received} to be a string enum value in ${Object.values(MyEnum)}`,
};
},
});
异步测试优化
Jest 默认使用 setTimeout()
函数来调度异步测试。这会导致不必要的延迟和不可预测性。使用 fakeTimers
模块可以优化异步测试,使它们更可靠且更快。
// 引入 fakeTimers 模块
const { fakeTimers } = require("@jest/fake-timers");
// 创建一个模拟定时器
const timers = fakeTimers();
// 运行异步测试
it("should resolve after 100ms", () => {
timers.runAllTimers();
expect(result).toBe("resolved");
});
快照测试(Snapshot Testing)
快照测试通过将组件的当前输出与已知的“快照”进行比较来验证组件行为。这对于测试用户界面或复杂数据结构非常有用。使用 Jest 的 toMatchSnapshot()
断言可以轻松地写入快照测试。
it("should render correctly", () => {
const wrapper = shallow(<MyComponent />);
expect(wrapper.debug()).toMatchSnapshot();
});
时间旅行(Time Travel)
Jest 允许您在时间中“旅行”,模拟特定时间点。使用 advanceTimersByTime()
方法,您可以快进模拟时钟以测试时间敏感的行为。
// 快进模拟时钟
timers.advanceTimersByTime(1000);
// 验证时间敏感行为
expect(timeElapsed).toBe(1000);
spyOn 和 mockFn
spyOn
和 mockFn
方法允许您监视和模拟函数调用。这对于测试依赖于外部库或类的方法很有用。
// 监视一个函数
const spy = spyOn(MyClass, "myMethod");
// 运行测试
myClass.myMethod();
// 验证函数调用
expect(spy).toHaveBeenCalled();
覆盖率报告
Jest 可以生成覆盖率报告,显示哪些代码行已在测试中覆盖。使用 --coverage
标志运行 Jest,生成报告并查找未涵盖的区域。
// 运行 Jest 覆盖率报告
npx jest --coverage
// 查看报告
open coverage/index.html
结论
熟练掌握这些 JavaScript Jest 忍者技巧,您将能够编写简洁、高效且易于维护的测试代码。通过定制断言、优化异步测试、使用快照测试、时间旅行、spyOn 和覆盖率报告,您可以提升 Jest 测试的水平,提高您的开发效率和代码质量。