Jest如何消除beforeEach/afterEach中的重复代码?
封装测试重复逻辑的实现方案
完全可以实现你想要的describeServerTest封装,把重复的beforeEach和afterEach逻辑统一抽离,具体实现如下:
第一步:实现封装函数
function describeServerTest(description: string, testSuite: (serverTestbed: ServerTestbed) => void) { describe(description, () => { let serverTestbed: ServerTestbed; // 通用的 beforeEach 逻辑 beforeEach(() => { serverTestbed = new ServerTestbed(); serverTestbed.run(); }); // 通用的 afterEach 逻辑 afterEach(async () => { await serverTestbed.close(); }); // 将初始化好的 serverTestbed 传递给自定义测试套件 testSuite(serverTestbed); }); }
如果serverTestbed.run()是异步方法(比如启动服务需要等待),记得把beforeEach改成异步:
beforeEach(async () => { serverTestbed = new ServerTestbed(); await serverTestbed.run(); // 等待服务启动完成再执行后续逻辑 });
第二步:使用封装后的函数
按照你预期的方式编写测试用例即可,只需要关注当前测试特有的逻辑:
describeServerTest("测试我的服务", (serverTestbed) => { let myService: MyService; // 可在此定义当前测试用例的其他变量 beforeEach(() => { myService = new MyService(serverTestbed.host, serverTestbed.port); // 这里添加当前测试专属的初始化操作 }); it("测试foo方法", () => { myService.foo(); expect(...).toBe(...); }); });
原理说明
这个封装函数把所有测试用例通用的服务初始化、销毁逻辑都收拢到内部,只把测试需要用到的serverTestbed实例传递给自定义测试套件。这样每个测试用例只需要编写自己特有的初始化和测试代码,彻底消除了重复的生命周期逻辑。
内容的提问来源于stack exchange,提问作者Chriss
相关产品推荐
相关产品推荐

