首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬聚合查询在Jest/Mockgoose测试中失败,在其他地方工作

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

Stack Overflow用户
提问于 2017-04-16 21:58:43
回答 2查看 7.2K关注 0票数 4

我正在尝试为我的Mongoose模型创建一些测试,但我想不出如何让Jest/Mockgoose测试通过一个简短的查询/聚合管道(参见下面的第一个代码块),我创建该管道是为了从一个集合中检索一个没有在另一个集合中引用的随机文档。

代码语言:javascript
复制
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()
}

玩笑试验

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
Activity.find().getUnused()
    .then((x) => {
     console.log(x);
})

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

代码语言:javascript
复制
   [ { _id: 58f3dee3b0346910a69e6e5d, activity: 'running', __v: 0 } ]

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

代码语言:javascript
复制
The 'cursor' option is required, except for aggregation explain

我如何用一种通用的方式解决这一问题,这种方式在两种情况下都有效?如果可能的话,我希望这个方法还承诺。我已经尝试过链式聚合方法(见上文)和用于管道的本机Mongo聚合数组,但都返回错误。如果相关的话,我的mongo版本是3.4.2。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-17 17:32:03

最后发现了这一点:我必须向聚合管道中添加一个游标调用,并将其转换为一个流。为了保持承诺,我让查询方法返回一个承诺,该承诺在流结束后用数据解析,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-05 13:34:04

我也遇到过类似的问题,经过大量研究后,我发现这是由于较早版本的猫鼬,因为早期版本与MongoDB 3.6及以上版本的中断更改不兼容。

我一个接一个地升级了猫鼬版本,我发现它在4.12.2(mongoose@4.12.2).以上版本上运行得非常好。

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

代码语言:javascript
复制
npm install mongoose@4.12.2
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43442588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档