NodeJS中的模块导出回调用于单元测试

时间:2016-05-19 22:11:16

标签: javascript node.js jestjs axios

我有以下代码用于在我的项目中使用axios建立服务器连接:

    axios.get('/someurl')
    .then(function (response) {
        console.log(response);
    }.bind(this))
    .catch(function (response) {
      console.log(response);
    });

我使用Jest作为测试框架,我成功地模拟了axios,但是我遇到了问题 - 函数:

module.exports = {
  get: function(a)
    console.log(a);
    console.log(b);
    return "abc";
  }
 }

但是,在运行测试时,我收到以下错误消息:

  

TypeError:_axios2.default.get(...)。然后不是函数

我必须以某种方式找到一种方法来告诉那么存在并且是一种功能。我必须在module.exports中执行此操作。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

您似乎期望get函数返回Promise。这就是then函数所暗示的内容。为此,您可以将get模型更改为以下内容:

module.exports = {
  get: function(a) {
    return new Promise(function(resolve, reject) {
      console.log(a);
      console.log(b);
      resolve('abc');
    });
  }
};

或者,如果您知道它将永远成功,您可以使用Promise.resolve来简化它:

module.exports = {
  get: function(a) {
    console.log(a);
    console.log(b);
    return Promise.resolve('abc');
  }
};

Promises的优点在于它们简化了异步流程。对于您的模型,这就是您所需要的,但您可以使用相同的过程来处理异步值。

module.exports = {
  get: function(a) {
    return new Promise(function(resolve, reject) {
      // Wait some period of time
      setTimeout(function() {
         // 'abc' + a is passed to the `then` function
         resolve('abc' + a);
      }, 1000);
    });
  }
};

然后,当您使用此模块时,它就像:

一样简单
var axios = require('./my-mockup.js');
axios.get('def')
.then(function(response) {
  console.log(response); // 'abcdef'
});