Wallaby.js与Jasmine callFake兼容问题求助
Wallaby.js与Jasmine callFake参数获取问题的解决方案
我之前也碰到过完全一样的问题——本地直接跑Jasmine测试时callFake能正常拿到参数,但用Wallaby.js运行就全变成undefined,折腾了好一会儿才找到几个可行的解决办法,分享给你:
1. 把callFake里的箭头函数换成普通函数
Wallaby的代码预处理机制对箭头函数的spy参数传递可能存在兼容问题,改成普通函数往往能解决:
it('test callFake and wallaby', async () => { // Arrange const myObj = { myFunc: (a) => a + 1, }; // 这里用普通函数替代箭头函数 spyOn(myObj, 'myFunc').and.callFake(function(a) { // 现在应该能正常拿到传入的参数a了 console.log('参数:', a); return a + 2; }); // Act const result = myObj.myFunc(5); // Assert expect(result).toBe(7); });
2. 检查Wallaby的配置文件
如果你的项目用了Babel或TypeScript,Wallaby的编译配置可能会干扰spy的参数传递:
- 确保
wallaby.js里的compilers配置没有对测试代码做过度转换,比如禁用不必要的箭头函数转译(如果测试环境支持ES6+) - 检查是否开启了
instrument选项的特殊配置,部分设置可能会破坏spy的参数捕获逻辑
3. 升级Wallaby.js和Jasmine版本
这个问题大概率是旧版本的兼容性bug,我当时把Wallaby升级到最新稳定版、Jasmine同步到匹配的版本后,参数undefined的问题直接消失了。建议优先尝试版本升级,毕竟官方会持续修复这类环境兼容问题。
4. 换一种参数获取方式(替代方案)
如果上面的方法都不行,可以绕过callFake的参数传递问题,直接通过spy的调用记录获取参数:
it('test callFake and wallaby', async () => { // Arrange const myObj = { myFunc: (a) => a + 1, }; const spy = spyOn(myObj, 'myFunc').and.callThrough(); // Act const result = myObj.myFunc(5); // 从spy的调用记录里取参数 const [param] = spy.calls.mostRecent().args; // Assert expect(param).toBe(5); // 如果需要自定义返回值,也可以用and.returnValue动态设置 spy.and.returnValue(param + 3); expect(myObj.myFunc(5)).toBe(8); });
额外排查点
- 在Wallaby的控制台里打印
arguments(普通函数里),确认是否真的没有参数传入,排除其他代码的干扰 - 检查项目中是否有全局的mock/stub工具(比如Sinon)和Jasmine的spy冲突,导致参数传递异常
内容的提问来源于stack exchange,提问作者Joilson Cisne
相关产品推荐
相关产品推荐

