使用ExpressJS进行单元测试

时间:2014-02-06 12:51:42

标签: javascript node.js unit-testing express mocha

我正在尝试对ExpressJS路线进行单元测试。它看起来像这样

server.js

var boards = require('./routes/BoardsRoute.js');
app.get('/api/v1/boards/:id', boards.getBoard);

BoardRoutes.js

exports.getBoard = function(req, res) {
  BoardModel.find({
        name: 'Kanban Board'
    }, function(err, columns) {
    if (!err) {
        return res.send(columns);
    } else {
        return console.log(err);
    }
});
return res.send(board);
};

我想模拟出BoardModel,因为这是对Mongoose模型(又称数据库调用)的调用。我假设单元测试不应该调用数据库并且没有服务器运行。

我是否应该完全独立于server.js app.get()调用测试getBoards。 (因为这些请求apt.get将由集成测试/ e2e测试覆盖,并且它们是HTTP请求)

我可以看到的所有文档和框架都必须运行Express Server才能对路由和这个特定的exports.getBoard进行单元测试。

我试图做的事情,

使用Sinon.js模拟假的服务器,以便我可以测试HTTP请求和getBoard方法。

使用SuperAgent和Super Test将请求发送到服务器。 (我对此感到不舒服,因为单元测试不应该运行服务器。)

我正在尝试使用Mocha来测试这些路线。

1 个答案:

答案 0 :(得分:0)

我会首先测试路线是否正确接线,然后测试路线的呼叫是否符合预期。

在这里测试路线是你可以做到的一种方式。创建一个仅连接路由的路由模块:

var routes = {};                                                                                                           

routes.create = function(app) {                                                                                                                                                                                     
   app.get('/api/v1/boards/:id', boards.getBoard);
}

module.exports = routes;

然后,您可以模拟app对象并检查get方法是否被正确调用。 (我倾向于使用Sinon.js。)需要从你的app模块调用create方法:

var app = express();
... // set up express
routes.create(app);

现在,您可以像其他任何模块一样专注于测试getBoard。