执行查找查询时如何使猫鼬失败

Posted

技术标签:

【中文标题】执行查找查询时如何使猫鼬失败【英文标题】: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);
);

【问题讨论】:

【参考方案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 *** topic。

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

图书馆:

sinonjs testdouble

【讨论】:

以上是关于执行查找查询时如何使猫鼬失败的主要内容,如果未能解决你的问题,请参考以下文章

模式实例化后如何使猫鼬模式属性唯一(已包含数据)

批量执行时如何查找失败的sql语句

Discord.js 猫鼬连接失败

多边形内的猫鼬地理查询

猫鼬 findOne,更新和执行

如何在使用猫鼬的查找查询中使用排序