【问题标题】:how can make mongoose fail when executing find query执行查找查询时如何使猫鼬失败
【发布时间】:2018-10-14 23:22:00
【问题描述】:

大家好,我正在为我的服务器编写 mocha 单元测试。我怎样才能得到猫鼬查找查询的错误。我已经尝试在执行之前关闭连接,但没有任何触发。

User.find({}, (err, result) => {
    if (err) {
        // I want to get here
    }
    return done(result);
});

【问题讨论】:

    标签: javascript node.js unit-testing mongoose mocha.js


    【解决方案1】:

    我像下面这样解决了它。这是解决方案。

    User = sinon.stub(User.prototype, 'find');
    User.yields(new Error('An error occured'), undefined);
    

    通过此代码,它将返回错误。 @ormaz @grégory-neut 感谢您的帮助。

    【讨论】:

      【解决方案2】:

      以下不适用于猫鼬,至少现在 (5.0.17)


      除了在find 请求上设置适当的超时之外,关闭与猫鼬的连接是一种测试方法。

      const request = User.find({});
      
      request.maxTime(1000);
      
      request.exec()
             .then(...)
             .catch(...);
      

      User.find({}, { maxTimeMS: 1000 }, (err, result) => {
          if (err) {
              // I want to get here
          }
      
          return done(result);
      });
      

      进一步研究后编辑


      在自己尝试之后,似乎我从来没有从请求中得到错误。

      更改请求maxTime 或连接参数auto_reconnectsocketTimeoutMSconnectTimeoutMS 似乎没有任何效果。请求仍然挂起。

      我发现this 堆栈溢出答案说当猫鼬与数据库断开连接时所有请求都排队。所以我们不会从那里得到任何超时。

      我可以推荐并且我在自己的项目中使用的另一个原因是将 mongoose 请求包装到我自己的类中。因此,如果数据库断开连接,我可以自己检查并抛出错误。

      【讨论】:

      • 它不工作。您的代码没有错误。 @grégory-neut
      • 你有什么连接参数?尤其是auto_reconnectsocketTimeoutMSconnectTimeoutMS。未经测试,但它应该完全可以工作
      • 没有特殊的参数。用于连接。这是我的连接设置 'mongoose.connect(url);"
      【解决方案3】:

      在我看来,测试错误处理的最佳方法是使用 mock。更多信息在this previous stackoverflow topic

      您可以模拟 mongoose 连接和 api 来驱动您的测试(引发错误...)。

      图书馆:

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 2022-12-05
        • 2018-11-28
        • 2016-06-03
        • 2020-09-14
        • 2021-09-12
        • 2018-06-15
        • 2021-08-03
        • 2019-01-17
        相关资源
        最近更新 更多