mongodb - Mongoose 聚合查询在 Jest/Mockgoose 测试中失败,在其他地方有效

标签 mongodb mongoose jestjs mockgoose

我正在尝试为我的 Mongoose 模型创建一些测试,但我无法弄清楚如何让 Jest/Mockgoose 测试通过我的速记查询/聚合管道(见下面的第一个代码块)创建用于从一个集合中检索未在另一个集合中引用的随机文档。

activitySchema.query.getUnused = function() {
    return Activity.aggregate()
        .lookup({
            from: 'userActivity',
            localField: '_id',
            foreignField: 'activity',
            as: 'matched_docs',
        })
        .match({ matched_docs: { $eq: [] } })
        .sample(1)
        .project({ matched_docs: 0, __v: 0 })
        .exec()
}

Jest 测试

describe('Activity methods', () => {
    test('Activity unused query executes', (done) => {
        function createActivity() {
            return Activity
                .create({ activity: 'running' })
                .then(activity => {
                    console.log('Activity is generated')
                    return Promise.resolve(true)
                })
        }
        async function retrieveActivity() {
            await createActivity()
            Activity
                .find()
                .getUnused()
                .then(unused => {
                    console.log(unused);
                    expect(unused).toHaveLength(1)
                    done()
                })
                .catch(x => {
                console.log(x)
                })
        }


        return retrieveActivity()
    })

})

沙盒节点 JS 代码:

Activity.find().getUnused()
    .then((x) => {
     console.log(x);
})

当我在沙箱节点文件中尝试时,机智正常工作并检索典型的查询集,如:

   [ { _id: 58f3dee3b0346910a69e6e5d, activity: 'running', __v: 0 } ]

当我运行测试时,我得到这个 MongoError:

The 'cursor' option is required, except for aggregation explain

如何使用适用于两种情况的通用方式解决此问题?如果可能的话,我希望该方法返回一个 promise 。我已经尝试了链式聚合方法(见上文)和更原生的 Mongo 管道聚合数组,但都返回错误。如果相关的话,我的 mongo 版本是 3.4.2。

最佳答案

我遇到过类似的问题,经过大量研究后我发现这是由于旧版本的 Mongoose 造成的,因为早期版本与 MongoDB 3.6 及更高版本中的重大更改不兼容。

我一个一个地升级了 mongoose 版本,我发现它与 mongoose 版本 4.12.2 或更高版本 (mongoose@4.12.2) 一起工作得很好。

您可以通过运行以下命令升级您的 mongoose 版本:

npm install mongoose@4.12.2

关于mongodb - Mongoose 聚合查询在 Jest/Mockgoose 测试中失败,在其他地方有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43442588/

相关文章:

node.js - 如何使用jade页面显示数据库中的名称

arrays - 查询所有数组项都大于指定条件的地方

node.js - 如何*不*保存 Mongoose 文档?

unit-testing - 开 Jest mock document.referrer

java - 如何从 Mongo Document 转换为 java Set<String>?

javascript - 如何在 Meteor 中通过任意属性(但不是 _id)查找一个集合项?

mongodb - Golang Mgo 按 ID 填充嵌套结构(Mongodb)

javascript - Mongoose 将两个查询合并为同一集合

reactjs - 使用 preloadedState : redux store gets out of sync when having a manual import of store in a function 在 React 中进行测试

typescript - 如何在 e2e 测试中测试包含异常过滤器的 websockets(网关)