如何模拟这个以继续 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 回调,我怎么知道它啥时候完成?