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

TypeScript Mocha测试中如何保留this上下文供自定义辅助函数使用

报错底层原因
  • Mocha 官方的 TypeScript 类型定义已经对 describe/it/beforeEach 等内置钩子做了特殊适配,运行时Mocha会自动把测试上下文绑定到这些钩子的普通函数上,TypeScript也能自动推导这些钩子内部的this类型。
  • 你自定义的普通辅助函数没有被TypeScript关联到Mocha的上下文类型规则,默认不知道该函数的this指向的是测试上下文,因此会抛出this隐式为any的报错。
  • 如果你使用箭头函数定义辅助函数,箭头函数的this会继承定义时的外层上下文,而Mocha的测试上下文是运行时才绑定到钩子函数的,外层上下文根本不存在你挂载的token属性,也会触发报错。
解决方案

你可以选择以下任意一种方式处理:

方式1:给辅助函数显式声明this类型

首先先定义你的测试上下文类型,再给辅助函数加TypeScript特有的this类型注解(该参数仅做类型校验用,编译后会自动移除,不影响实际调用传参):

// token.behavior.ts
// 先定义测试上下文类型,替换YourTokenType为你的Token实际类型
interface TestContext {
  token: YourTokenType
}

export function shouldBehaveLikeToken(): void {
  describe('balanceOf', function () {
    it('returns the correct balance', async function() {
      // 调用时用call绑定当前钩子的this上下文
      expect(await balanceOf.call(this)).to.equal(2);
    });
  });

  // 给辅助函数加this类型注解
  function balanceOf(this: TestContext) {
    return this.token.balanceOf(ADDRESS);
  }
}

方式2:直接将上下文作为参数传入(更不易出错)

如果不想处理this绑定问题,可以直接把测试上下文作为显式参数传入辅助函数:

function balanceOf(ctx: TestContext) {
  return ctx.token.balanceOf(ADDRESS);
}

// 在it钩子内直接传入当前this即可
it('returns the correct balance', async function() {
  expect(await balanceOf(this)).to.equal(2);
});

方式3:全局扩展Mocha上下文类型

如果token属性是全局通用的测试挂载属性,可以直接扩展Mocha的原生Context类型,无需再单独定义TestContext:

// 全局类型声明文件如global.d.ts中加入
declare module 'mocha' {
  interface Context {
    // 替换YourTokenType为你的Token实际类型
    token: YourTokenType
  }
}

配置完之后所有Mocha钩子内的this都会自动识别token属性,辅助函数的this注解直接写this: Mocha.Context即可。

注意:不要使用箭头函数定义需要访问测试上下文的辅助函数,箭头函数的this无法通过call/apply动态绑定运行时的Mocha上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:36:02