当前位置:  开发笔记 > 编程语言 > 正文

如何在ES6中存根导出函数?

如何解决《如何在ES6中存根导出函数?》经验,为你挑选了3个好方法。

我有文件foo.js:

export function bar (m) {
  console.log(m);
}

另一个使用foo.js,cap.js的文件:

import { bar } from 'foo';

export default m => {
  // Some logic that I need to test
  bar(m);
}

我有test.js:

import cap from 'cap'

describe('cap', () => {
  it('should bar', () => {
      cap('some');
  });
});

不知怎的,我需要覆盖bar(m)测试中的实现.有没有办法做到这一点?

PS我使用babel,webpack和mocha.



1> Mike Chaliy..:

哎哟..我找到了解决方案,所以我用sinonstub import * as foo from 'foo'来获取所有导出函数的对象,所以我可以将它们存根.

import sinon from 'sinon';
import cap from 'cap';
import * as foo from 'foo';

sinon.stub(foo, 'bar', m => {
    console.log('confirm', m);
});

describe('cap', () => {
  it('should bar', () => {
    cap('some');
  });
});


我认为这不适用于实际(非babel-transiled)ES6环境
@Bergi是的,根据我目前的理解,导出实际上导出了不可变对象,并且因为现在使用常规对象实现它可能会在以后失败.

2> DreamSonic..:

您只能从模块本身中替换/重写/存根导出.(这是一个解释)

如果你像这样重写'foo.js':

var bar = function bar (m) {
  console.log(m);
};

export {bar}

export function stub($stub) {
  bar = $stub;
}

然后,您可以在测试中覆盖它,如下所示:

import cap from 'cap'
import {stub} from 'foo'

describe('cap', () => {
  it('should bar', () => {
      stub(() => console.log('stubbed'));
      cap('some'); // will output 'stubbed' in the console instead of 'some'
  });
});

我创建了一个Babel插件,可以自动转换所有导出,以便它们可以存根:https://github.com/asapach/babel-plugin-rewire-exports



3> Daniel Conde..:

@Mike解决方案可以在旧版本的sinon中使用,但自sinon 3.0.0起已将其删除。

现在代替:

sinon.stub(obj, "meth", fn);

你应该做:

stub(obj, 'meth').callsFake(fn)

模拟Google oauth api的示例:

import google from 'googleapis';

const oauth2Stub = sinon.stub(); 

sinon.stub(google, 'oauth2').callsFake(oauth2Stub);

oauth2Stub.withArgs('v2').returns({
    tokeninfo: (accessToken, params, callback) => {
        callback(null, { email: 'poo@bar.com' }); // callback with expected result
    }
});


我认为这不能解决有关在sinon 3.x中伪造导出函数的原始问题。您可以扩展答案以解决原始问题吗?
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有