SpyOn单独导出ES6功能

Ser*_*lov 7 javascript unit-testing jasmine ecmascript-6

TL;博士:

  1. 我用Jasmine ;
  2. 我想测试从同一模块aaa调用的函数bbb;
  3. 我想窥探bbb,但最终aaa称之为原始bbb功能,而不是间谍;

我怎么强迫aaa打电话给间谍?

模块:

export function aaa() {
  return bbb();
}

export function bbb() {
  return 222;
}
Run Code Online (Sandbox Code Playgroud)

考试:

import * as util from 'my-module';

describe('aaa test', () => {

  let bbbSpy: Spy;

  beforeEach(() => {
    bbbSpy = spyOn(util, 'bbb');
  });

  it('should return SPYED', () => {
    bbbSpy.and.returnValue('SPYED!!');
    const result = util.aaa();
    expect(result).toEqual('SPYED!!'); // Doesn't work - still 222
  });

});
Run Code Online (Sandbox Code Playgroud)

所以,基本上这不起作用.有人可以帮我吗?

PS我不想更改模块的代码,因为在这种情况下我将不得不改变项目中的大量代码.我需要一个通用的测试解决方案.

Sir*_*ple 5

甚至认为不是同一框架,还有一个相关的问题向您提供了为什么这样不起作用:如何使用jest在同一模块中模拟函数。基本上,您将无法访问该功能的固定引用,而是明确指出该功能与模块上下文中的功能相同。

我知道这不能满足您在问题中发布的约束,但是这很明显地表明,使用间谍无法实现您想要的目标。

使用JavaScript,无法交换对某些内容的引用。您不能换出模块内部的功能。当您在示例中尝试使用spyOn.and.returnValue覆盖bbb时,您只是在测试中修改了本地绑定bbb,但对其他文件中的bbb绑定没有影响。