2017-06-05 39 views
0

我想从下面的模块中对函数getAuthorizedUsers进行单元测试。我需要测试的核心功能是在DB.getUsers的回调函数中。我无法找到模仿DB.getUsers回调的方法。如何在Nodejs中测试嵌套的异步调用?

(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

https://mochajs.org/#asynchronous-code –

回答

0

我认为你对测试node.js的

  1. 使用茉莉或摩卡框架 - 他们支持清洁语法测试异步的东西。 http://tobyho.com/2015/12/16/mocha-with-promises/
  2. 在大多数情况下坚持使用承诺而不是回调。它会让你的生活变得更加轻松,在边缘情况下进行一些折衷。
  3. 您不需要在node.js中使用IIFE,因为每个模块都有自己的全局变量。
  4. 这将帮助你嘲笑节点模块:

+0

感谢您的答复。你说得对,它是Nodejs。我的问题仍然在“DB.getUsers”中。我试图达到的目标是将它存根,所以我会改变它的实现,并因此将它的回调用任何我想要的用户列表解雇。也许这个问题不是正确的。 –

+0

啊,理解。用模拟模块的东西更新了答案。 –

+0

proxyquire似乎我正在寻找。我会检查它,然后将答案标记为解决方案。谢谢。 –