【问题标题】:Module export callback in NodeJS for Unit Test用于单元测试的 NodeJS 中的模块导出回调
【发布时间】:2016-09-17 00:32:22
【问题描述】:

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

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

我正在使用 Jest 作为测试框架,并且我成功地模拟了 axios,但是我对这个 then-Function 有问题:

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

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

TypeError: _axios2.default.get(...).then 不是函数

我必须找到一种方法来告诉它存在并且是一个函数。我必须在 module.exports 中执行此操作。关于如何做到这一点的任何想法?

【问题讨论】:

  • Promise 有一个then 函数。你的模拟函数需要返回一个 Promise。
  • 那么就不需要mock本身了吗?
  • 对。只需从您的 get 函数返回一个 Promise。
  • return new Promise(function(abc) { console.log("jlk"); }) 这样的东西将取代我的实际实现,对吗?
  • 如果您希望结果始终成功,则只需 return Promise.resolve('abc')

标签: javascript node.js jestjs axios


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

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 2015-12-10
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2013-12-18
    相关资源
    最近更新 更多