【问题标题】:How to mock a method thats imported inside of another import如何模拟在另一个导入中导入的方法
【发布时间】:2017-10-03 06:39:38
【问题描述】:

我在 ES6 babel-node 环境中进行测试。我想模拟一个在我正在导入的方法中使用的方法。具有挑战性的部分似乎是我要模拟的方法被导入到我要测试的方法所在的文件中。我已经探索了 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');
});

【问题讨论】:

  • 如果你可以修改你测试的文件,你可以使用依赖注入技术来解决你的问题。其中一些在jasonpolites.github.io/tao-of-testing/ch3-1.1.html 中进行了描述。例如,您可以通过将 getSomething 函数作为 requestSomethign 的参数传递来做到这一点。
  • @FrankBessou 是的,我意识到我可以将它作为参数传递。如果有必要,这并不可怕,但我真的希望不必为我的所有方法添加额外的参数。感谢您的关注和建议/链接。
  • 如果您的所有方法都需要相同的函数,您仍然可以将此函数传递给类构造函数。

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


【解决方案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');
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2018-04-23
    相关资源
    最近更新 更多