You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:20:23