使用Jest为EventEmitter编写单元测试的相关技术咨询
结论
完全没必要为这三行代码单独写单元测试。
原因说明
- 这段代码没有任何自定义业务逻辑,本质就是个胶水文件:引入Node内置的
events模块,创建一个EventEmitter实例,把这个实例作为单例导出而已。 - 内置
events模块的所有功能Node官方已经做过完备测试,你不需要重复验证基础库本身能不能正常工作,纯属浪费时间。 - 你现在写的测试从根上就错了:加了
jest.mock("./newCommandEmitter.js")之后,Jest会自动生成个假的mock对象替换你真实写的源码,你最后断言toBeTruthy()根本没测到自己的代码,毫无意义。
正确处理方式
- 别在这个文件上浪费测试精力,这类没有分支、没有状态变更、没有业务判断的胶水代码,单独写测试的投入产出比为0。
- 真正要测的是所有依赖这个emitter的业务代码:比如别的文件里监听了这个emitter的某个事件,你测业务逻辑的时候自然会引入这个实例,验证事件触发时回调有没有正常执行、参数对不对,这个过程就已经间接覆盖了这个文件的导出逻辑,完全不需要单独给它写用例。
- 如果你就是怕以后有人手贱改坏这个文件的导出,想加个10秒钟就能写完的基础校验也可以,记得别加任何mock:
const newCommandEmitter = require("./newCommandEmitter.js"); const EventEmitter = require("events"); describe("newCommandEmitter 导出校验", () => { test("导出值为EventEmitter实例且为单例", () => { expect(newCommandEmitter).toBeInstanceOf(EventEmitter); // 验证多次导入拿到的是同一个实例 expect(require("./newCommandEmitter.js")).toBe(newCommandEmitter); }); });
额外认知纠正
你之前查到的“使用相关功能时需要调用newCommandEmitter”是理解偏差。这个文件里已经完成了EventEmitter的实例化,其他文件直接导入这个导出的实例,就能用.on()绑定监听、.emit()触发事件,不需要自己再执行new操作。
内容的提问来源于stack exchange,提问作者joe_riddly
相关产品推荐
相关产品推荐

