如何在Nodejs中测试嵌套异步调用?

时间:2017-06-05 10:47:19

标签: javascript node.js unit-testing testing chai

我想从以下模块对getAuthorizedUsers函数进行单元测试。我需要测试的核心功能是在DB.getUsers的回调函数中。我找不到模仿DB.getUsers回调的方法。

(function () {
    const DB = require('./DB');

    function getAuthorizedUsers(req, res, callback) {
        DB.getUsers(req.db, req.userId, function(err, users) {
            users.push({id: 0});
            req.users = users;
            callback(req, res);
        });
    }

    module.exports = {
        getAuthorizedUsers: getAuthorizedUsers
    };
})();

这是我到目前为止所做的:

(function () {
    "use strict";

    var chai = require("chai");
    var User = require("./User");

    suite("API", function () {
        suite("getAuthorizedUsers", function() {
            var req = {
                db: {},
                userId: '',
            };
            var res = {};
            test("adds admin to list of authorized users", function() {
                User.getAuthorizedUsers(req, res, function(req, res) {
                    //assert that req contains the correct list of authorized users
                });
            });
        });
    });
}());

为了简化,我更改了名称和代码逻辑。所以,如果代码不遵循最佳实践或没有意义,请原谅我。

编辑:您对如何存根“DB.getUsers”有任何建议吗?

1 个答案:

答案 0 :(得分:0)

我假设你测试了node.js

  1. 使用jasmine或mocha框架 - 它们支持用于测试异步内容的干净语法。 http://tobyho.com/2015/12/16/mocha-with-promises/
  2. 在大多数情况下,坚持使用promises而不是回调。它将使你的生活变得更加轻松,在边缘案例上进行一些权衡。
  3. 您不需要在node.js中使用IIFE,因为每个模块都有自己的全局变量。
  4. 这些将帮助您模拟节点模块: