如何模拟在另一个导入中导入的方法

时间:2017-05-04 22:35:24

标签: javascript node.js unit-testing babel babel-node

我正在ES6 babel节点环境中进行测试。我想模拟我正在导入的方法内部使用的方法。具有挑战性的部分似乎是我想要模拟的方法被导入到我想要测试的方法所在的文件中。我已经探索了proxyquire,babel-plugin-rewire,但我似乎无法让他们处理在其他导入中导入的方法。从阅读各种github问题,我感觉这可能是一个已知的限制/挫折。这是不可能的还是我错过了什么?

使用proxyquire或babel-plugin-rewire时不会产生错误。该方法不会被模拟,它返回方法的正常值。

以下是导入情况的一般示例。

// serviceLayer.js

getSomething(){
  return 'something';
}


// actionCreator.js

import { getSomething } from './serviceLayer.js';

requestSomething(){
  return getSomething();  <------- This is what I want to mock
}


// actionCreator.test.js

import test from 'tape';
import {requestSomething} from 'actionCreator.js'

test('should return the mock' , (t) => {
  t.equal(requestSomething(), 'something else');
});

1 个答案:

答案 0 :(得分:1)

我在这里回答我自己的问题......事实证明我只是错误地使用了babel-plugin-rewire。以下是我现在如何使用它并获得成功结果的一个例子。

  // serviceLayer.js

  export const getSomething = () => {
    return 'something';
  }


  // actionCreator.js

  import { getSomething } from './serviceLayer.js';

  export const requestSomething = () => {
    return getSomething();  <------- This is what I want to mock
  }


  // actionCreator.test.js

  import test from 'tape';
  import { requestSomething, __RewireApi__ } from 'actionCreator.js'
  __RewireApi__.Rewire('getSomething' , () => {
    return 'something else''
  });

  test('should return the mock' , (t) => {
    t.equal(requestSomething(), 'something else');
  });