Javascript 通过es6模块上的闭包与调用实现js调用功能

Javascript 通过es6模块上的闭包与调用实现js调用功能,javascript,ecmascript-6,commonjs,Javascript,Ecmascript 6,Commonjs,我有两个定义如下的函数: export function builder(){ ... }; export function action() { return () => builder() }; 现在我试图编写一个模拟构建器函数并返回{}的测试 import * as m from 'redux/modules/mymodule'; it('call buildSolrUrl', () => { const spy = expect.spyOn(m, "builder

我有两个定义如下的函数:

export function builder(){ ... };
export function action() { return () => builder() };
现在我试图编写一个模拟构建器函数并返回{}的测试

 import * as m from 'redux/modules/mymodule';

 it('call buildSolrUrl', () => {
  const spy = expect.spyOn(m, "builder").andReturn({});
  m.action()();
  expect(spy.calls.length).toEqual(1);
 });
问题是,在这种情况下,构建器不会得到mock。 如果我为以下内容更改代码:

export function action() { return () => this.builder() };
该方法被模拟,但我的程序不再工作,因为action()返回一个稍后执行的函数,
未解析为正确的对象

继续:我的代码可以工作,因为对builder()的调用是通过闭包完成的。 测试无法以这种方式模拟函数,因为函数是通过闭包调用的


处理此问题的最佳方法是什么?

请尝试此
导出默认函数生成器(){…}然后
间谍(m,'默认')..
!这是行不通的。这样做,您就不会模拟builder()函数,并且该方法的代码将被执行(我不希望)可能的重复。请尝试此
export default function builder(){…}然后
间谍(m,'默认')..
!这是行不通的。这样做,您就不会模拟builder()函数,并且该方法的代码将被执行(我不希望)可能的重复