升级ts-node至v10后Sinon stub失效,如何调整配置解决该问题?
问题根因
该问题确实由SWC转译器的模块处理逻辑导致。SWC为了提升性能默认开启了静态优化,同一个模块内部的函数互相调用时,会直接绑定函数本身的原始引用,而非绑定模块exports对象上的导出值。你用Sinon stub的是模块导出对象上的getAWSLambda,但AWSLambda类构造函数里实际调用的是SWC优化后的内部原始函数,和你stub的不是同一个引用,因此stub失效。
解决方案
提供三种可选方案,可根据自身需求选择:
方案1:调整SWC转译配置(推荐,无需修改业务代码)
在tsconfig.json的ts-node配置段新增SWC的转译规则,关闭模块静态优化,保留SWC的转译速度优势:
{ "compilerOptions": { // 原有配置保持不变 }, "ts-node": { "transpileOnly": true, "transpiler": "ts-node/transpilers/swc-experimental", "swc": { "jsc": { "transform": { "commonjs": { "strict": false, "importInterop": "node" } } } } } }
方案2:修改业务代码兼容stub逻辑(兼容性最强)
修改lambda.ts文件,让类内部调用显式指向模块导出的方法,确保和你stub的引用一致,该方案不受转译器配置和版本影响,后续升级工具链也不会再次出现类似问题:
// file: ./lambda.ts export const getAWSLambda = () => new AWS.Lambda({ region: AWS_DEFAULT_REGION }); export class AWSLambda { private readonly lambda: AWS.Lambda; constructor() { // 改为调用模块导出对象上的方法,而非直接调用内部函数 this.lambda = exports.getAWSLambda(); } // 其余代码保持不变 }
方案3:换回默认TypeScript转译器
如果不需要SWC的极速转译能力,直接移除transpiler配置项即可回退到ts-node默认的转译逻辑,不会出现stub失效问题:
"ts-node": { "transpileOnly": true }
以上方案修改完成后重新运行单元测试,即可正常触发stub逻辑。
内容的提问来源于stack exchange,提问作者Rife
相关产品推荐
相关产品推荐

