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

TypeScript带类型参数函数单元测试报错的排查与解决

问题描述

我有如下TypeScript函数:

export const AuthHandler = {
    isTokenNeedRefresh: (seconds: number) => {
        const accessToken = localStorage.getItem(WheelGlobal.ACCESS_TOKEN_NAME);
        if(!accessToken){
            return false;
        }
        const claim = JSON.parse(atob(accessToken.split('.')[1]));
        const exp = claim.exp;
        const now = Math.floor(Date.now() / 1000);
        // seconds was the token prereload time gap
        const isExpired = exp < now + seconds;
        if (isExpired) {
            return true;
        }else{
            return false;
        }
    }
}

我为该函数编写了如下Mocha+Chai单元测试代码:

import 'mocha'
import { expect } from 'chai'
import AuthHandler from "../../../src/auth/extension/AuthHandler";

describe('Auth Test', function () {
    it('Parse jwt token', async function () {
        const result = AuthHandler.isTokenNeedRefresh(16000);
        expect(typeof result).to.be('boolean');
    })
})

运行测试时出现语法错误,报错信息如下:

FAIL  test/auth/extension/AuthHandler.test.ts
  ● Test suite failed to run

    SyntaxError: /Users/xiaoqiangjiang/source/reddwarf/frontend/js-wheel/src/auth/extension/AuthHandler.ts: Unexpected token, expected "," (8:32)

       6 |
       7 | export const AuthHandler = {
    >  8 |     isTokenNeedRefresh: (seconds: number) => {
         |                                 ^
       9 |         const accessToken = localStorage.getItem(WheelGlobal.ACCESS_TOKEN_NAME);
      10 |         if(!accessToken){
      11 |             return false;

      at Parser._raise (node_modules/@babel/parser/src/parser/error.js:150:45)
      at Parser.raiseWithData (node_modules/@babel/parser/src/parser/error.js:145:17)
      at Parser.raise (node_modules/@babel/parser/src/parser/error.js:89:17)
      at Parser.unexpected (node_modules/@babel/parser/src/parser/util.js:174:16)
      at Parser.expect (node_modules/@babel/parser/src/parser/util.js:150:28)
      at Parser.parseParenAndDistinguishExpression (node_modules/@babel/parser/src/parser/expression.js:1702:14)
      at Parser.parseExprAtom (node_modules/@babel/parser/src/parser/expression.js:1122:21)
      at Parser.parseExprSubscripts (node_modules/@babel/parser/src/parser/expression.js:682:23)
      at Parser.parseUpdate (node_modules/@babel/parser/src/parser/expression.js:662:21)
      at Parser.parseMaybeUnary (node_modules/@babel/parser/src/parser/expression.js:633:23)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.414 s
Ran all test suites within paths "/Users/xiaoqiangjiang/source/reddwarf/frontend/js-wheel/test/auth/extension/AuthHandler.test.ts".
Waiting for the debugger to disconnect...

请问我遗漏了什么?该如何修复此问题?我是在VS Code中运行该测试的。


问题分析

报错核心是Babel解析TS代码时无法识别参数的类型注解(seconds: number),原因是测试环境未正确配置TypeScript编译支持:Mocha默认只能解析JavaScript代码,直接运行TS文件时,会把TS特有的语法(比如类型注解)当成非法JS语法,从而抛出语法错误。


修复方案

方案1:使用ts-mocha直接运行TS测试

ts-mocha是整合了TypeScript编译的Mocha工具,无需额外配置即可运行TS测试:

  • 安装依赖:
npm install ts-mocha typescript @types/mocha @types/chai --save-dev
  • 修改package.json中的测试命令:
"scripts": {
  "test": "ts-mocha test/**/*.test.ts"
}
  • 运行测试:
npm run test

方案2:配置Babel转译TypeScript

如果要继续使用原生Mocha,需配置Babel将TS代码转译为JS后再运行:

  • 安装依赖:
npm install @babel/core @babel/preset-env @babel/preset-typescript @babel/register mocha chai --save-dev
  • 在项目根目录创建.babelrc配置文件:
{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-typescript"
  ]
}
  • 修改package.json中的测试命令:
"scripts": {
  "test": "mocha --require @babel/register test/**/*.test.ts"
}
  • 运行测试:
npm run test

额外优化点

  • 测试代码中的async可以移除,因为isTokenNeedRefresh是同步函数,不需要异步测试逻辑。
  • 确保项目根目录存在tsconfig.json,配置符合项目的TypeScript编译规则(比如target设为ES6及以上)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:13:18