我在这个应用程序中得到了很多回调,最终成为“回调地狱”的一个很好的例子。具有 200 或 300 行和 10、15 个嵌套回调的方法。
然后,作为一个好的实践,我分离了大部分回调,命名为 then 并使用 Bluebird Promise 创建了更有组织的“then-chains”。
我不知道为什么,因为我实现的所有测试和方法都非常相似,所以同一方法的两个测试用例都失败了。
它使用 Sinon 检查是否调用了next
函数和 DAO 方法(进行 Mongo 查询)。
然后我意识到这个方法的变化是我将一些在该方法开始时运行的逻辑转移到了一个 Promise 中。
对“下一步”的调用没有得到评估,true
因为测试没有等待承诺完成并错误地返回。
这是显示不良行为的测试部分:
var nextSpy = sinon.spy();
var methodSpy = sinon.spy(my_controller.options.dao, "findAsync");
my_controller.sendMail(req, res, nextSpy);
expect(methodSpy.called).to.be.true;
expect(sendMailSpy.called).to.be.false;
我已经更改了控制器方法,但基本上,我在承诺中包含了逻辑。把它拿出来解决问题。