在Jest / Mockgoose测试中,Mongoose聚合查询失败,在其他地方工作

问题描述 投票:4回答:2

我正在尝试为我的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()
}

有一个测试

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()
    })

})

Sandbox Node 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。

mongodb mongoose jestjs mockgoose
2个回答
7
投票

最后想出来了:我必须向聚合管道添加一个游标调用,并将其转换为一个流。为了维护Promise,我使用查询方法返回一个Promise,它在流结束后解析数据,如下所示:

activitySchema.query.getUnused = function() {
    return new Promise((res, rej) => {
        let data = []
        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 })
            .cursor({})
            .exec()
            .on('data', doc => data.push(doc))
            .on('end', () => res(data))

    })
}

7
投票

我遇到过类似的问题,经过大量的研究后我发现它是由于较早版本的mongoose,因为早期版本与MongoDB 3.6及更高版本中的重大变化不兼容。

我一个一个地升级了猫鼬版本,我发现它与猫鼬版本4.12.2或以上([email protected]).完美搭配

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

npm install [email protected]
© www.soinside.com 2019 - 2024. All rights reserved.