我正在尝试对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来测试这些路线。
答案 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。