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

如何在Jest中根据钱包特性选择性执行或跳过测试?

解决方案:基于钱包支持能力的条件测试执行

针对你的问题,核心难点在于测试定义阶段早于beforeAll的初始化时机,导致无法在test()外部直接获取已初始化的wallet对象。下面提供几种在主流测试框架(以Jest为例)中可行的实现方式:

方案1:单个测试用例内部判断并跳过

在测试逻辑开始前直接判断钱包是否支持目标功能,不满足则跳过当前用例。注意使用普通函数而非箭头函数,才能调用框架的this.skip()方法:

test("AVAX链交易签名测试", async function() {
  // 判断当前钱包是否支持AVAX链签名
  if (!wallet.supportsAvaxSigning()) {
    this.skip(); // 跳过当前测试,不会标记为失败
  }

  // 执行实际测试逻辑
  const txParams = { chainId: 43114, to: "0x...", value: "1000000000000000000" };
  const signedTx = await wallet.signTransaction(txParams);
  expect(signedTx.signature).toBeDefined();
});

如果使用Mocha框架,逻辑完全一致,同样用this.skip()即可。

方案2:在beforeAll中动态生成测试用例

利用beforeAll初始化完成后可以访问wallet的特性,动态创建测试用例:

describe("DEX钱包兼容性测试", () => {
  let wallet;

  beforeAll(async () => {
    wallet = await initializeWallet(); // 你的钱包初始化逻辑

    // 根据钱包支持能力动态添加测试
    if (wallet.supportsAvaxSigning()) {
      test("AVAX链签名交易", async () => {
        const signedTx = await wallet.signTransaction({ chainId: 43114 });
        expect(signedTx).toHaveProperty("r");
        expect(signedTx).toHaveProperty("s");
      });
    } else {
      test.skip("AVAX链签名交易", () => {}); // 标记为跳过的测试
    }
  });

  // 所有钱包通用的测试用例
  test("基础钱包连接", async () => {
    const isConnected = await wallet.connect();
    expect(isConnected).toBe(true);
  });
});

这种方式能确保只有支持该功能的钱包才会生成对应的测试用例,不会出现无效的测试条目。

方案3:跳过整个功能测试块

如果某一类功能(比如多链签名)下有多个测试用例,可以把它们放在单独的describe块中,在该块的beforeAll里判断并跳过整个块:

describe("DEX钱包兼容性测试", () => {
  let wallet;

  beforeAll(async () => {
    wallet = await initializeWallet();
  });

  // 通用功能测试(所有钱包必跑)
  describe("通用基础功能", () => {
    test("获取钱包地址", async () => {
      const address = await wallet.getAddress();
      expect(address).toMatch(/^0x[a-fA-F0-9]{40}$/);
    });
  });

  // 条件功能测试(仅支持AVAX的钱包执行)
  describe("AVAX链专属功能", function() {
    beforeAll(() => {
      if (!wallet.supportsAvaxSigning()) {
        this.skip(); // 跳过整个describe块下的所有测试
      }
    });

    test("AVAX链交易签名", async () => {
      const signedTx = await wallet.signTransaction({ chainId: 43114 });
      expect(signedTx).toBeDefined();
    });

    test("AVAX链交易发送", async () => {
      const txHash = await wallet.sendTransaction({ chainId: 43114 });
      expect(txHash).toMatch(/^0x[a-fA-F0-9]{64}$/);
    });
  });
});

这种方式适合批量处理同类型的条件测试,避免重复写判断逻辑。

关键注意点

  • 所有依赖wallet的条件判断必须放在测试执行阶段(beforeAll、test内部),不能放在测试定义阶段(比如直接在describe外层写if),因为测试定义阶段早于beforeAll的初始化时机。
  • 不同测试框架的跳过API略有差异,但核心逻辑一致:Jest/Mocha用this.skip(),Vitest用this.skip()或test.skip()。

内容的提问来源于stack exchange,提问作者foufrix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:40:28