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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:49