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
相关产品推荐
相关产品推荐

