如何模拟这个以继续 async.each() 调用

Posted

技术标签:

【中文标题】如何模拟这个以继续 async.each() 调用【英文标题】:How to mock this to continue the async.each() call 【发布时间】:2018-02-04 00:58:06 【问题描述】:

我有以下方法,removeOldObjects 我想进行单元测试。它从现有对象列表中删除对象。我相信这些对象是猫鼬实例。我了解该方法在做什么,我正在尝试模拟它的输入,包括return existinObj.remove(cb) 中的remove() 方法。真正的remove() 的文档在这里:http://mongoosejs.com/docs/api.html(Model#remove([fn]) 部分)。看起来它应该返回一个 Promise。

我正在努力弄清楚如何有效地使 return existinObj.remove(cb) 执行 return cb(null) 以将 async.each() 调用移动到其最终回调,甚至是 Promise 应该如何完成此方法。我玩弄了使用 Promise,但没有得到任何结果(最近刚拿起 javascript/Node)

我需要如何定义removeMethod(在下面的脚本部分),以便我可以正确地测试这个方法并到达最终的回调?

方法:

const _ = require('underscore')
...
removeOldObjects (keepObjects, existingObjects, callback) 
  let objectsToReturn = []

  async.each(existingObjects, function (existinObj, cb) 
    let foundObj = _.find(keepObjects, function (thisObj) 
      return existinObj.id == thisObj.id
    )

    if (foundObj)         
      objectsToReturn.push(object)
      return cb(null)
     else 
      // Would like below to in effect behve like "return cb(null)",
      // so it can reach the final callback at the end
      return existinObj.remove(cb)
    
  , function (err) 
    return callback(err, objectsToReturn)
  )

测试脚本(使用 Mocha):

const test = new MyClass()
const keepObjects = [id: 5]  // removeDeadCams() does not hit its final callback
// const keepObjects = [id: 1]   // removeDeadCams() runs its full course
const existingObjects = [
  id: 1, remove: removeMethod
]
test.removeOldObjects(keepObjects, existingObjects, function (err, res) 
  console.log('error-----')
  console.log(err)
  console.log('response-----')
  console.log(res)  
)

【问题讨论】:

【参考方案1】:

Mongoose 文档remove 方法仅在未提供回调时才返回承诺。在removeOldObjects 实现中提供了它。所以你不应该返回一个承诺,而不是这个你应该调用提供的回调:

remove 函数添加到每个existingObjects 项目并从这里调用回调:

const test = new MyClass()

const oldObjects = [
   id: 5 
];
const existingObjects = [
   id: 1, remove: cb => cb(1)  // call it with id of the item to validate in your test
];

test.removeOldObjects(oldObjects, existingObjects, function(err, res) 
  console.log(res); // outputs [null, 1] 
)

【讨论】:

很高兴 很有帮助,会回答你关于摩卡的所有问题:)

以上是关于如何模拟这个以继续 async.each() 调用的主要内容,如果未能解决你的问题,请参考以下文章

ES6 Promises - 类似 async.each 的东西?

async.map 或 async.each 与 async.parallel 有啥区别?

async.map 或 async.each 与 async.parallel 有啥区别?

node.js async.each 回调,我怎么知道它啥时候完成?

在 Shiny 应用程序中,如何暂停 for 循环以获取用户输入,然后在单击按钮后继续?

以预期格式打印 JSON 数组