2017-04-16 116 views
2

我正在嘗試爲我的Mongoose模型創建一些測試,並且我無法弄清楚如何讓Jest/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() 
} 

玩笑測試

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 

如何解決這個問題有,在這兩種環境中工作的通用的方式?如果可能,我希望該方法能夠返回承諾。我已經嘗試了鏈式聚合方法(參見上文)和更流行的管道Mongo聚合數組,但都返回錯誤。如果這是相關的,我的mongo版本是3.4.2。

回答

5

最後解釋了這一點:我不得不將遊標調用添加到聚合管道,並將其轉換爲流。爲了保持承諾我有查詢方法 返回的數據解析,一旦流已結束的承諾,如下:

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

    }) 
} 
+0

如果您正在使用蒙戈3.5這個問題只發生* – JCM

相關問題