【问题标题】:Mongoose aggregation query fails in Jest/Mockgoose test, works elsewhereMongoose 聚合查询在 Jest/Mockgoose 测试中失败,在其他地方工作
【发布时间】:2017-09-12 13:06:47
【问题描述】:

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

})

沙盒节点 JS 代码:

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

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

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

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

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

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

【问题讨论】:

    标签: mongodb mongoose jestjs mockgoose


    【解决方案1】:

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

    我一一升级了猫鼬版本,我发现它与猫鼬版本4.12.2或更高版本(mongoose@4.12.2).完美配合

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

    npm install mongoose@4.12.2
    

    【讨论】:

      【解决方案2】:

      终于想通了:我必须在聚合管道中添加一个游标调用,并将其转换为流。为了维护 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))
      
          })
      }
      

      【讨论】:

      • 只有在使用 mongo 3.5 时才会出现此问题。*
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2020-02-20
      • 1970-01-01
      • 2015-02-05
      • 2020-01-01
      • 1970-01-01
      相关资源
      最近更新 更多