我们启动了一个节点应用程序,我们将使用Express作为路由器。在我们的一个控制器中,我们定义了这个:
var express = require('express');
var router = express.Router();
// api/products
router.get('/', function (req, res) {
res.json({ products: [] });
});
// api/products/:id
router.get('/:id', function (req, res) {
res.json({ id: req.params.id });
});
module.exports = router;
我一直在尝试关注如何测试这个问题的例子并提出:
var hippie = require('hippie');
var server = require('../controllers/products');
describe('Products Controller Tests', function () {
describe('/products endpoint', function () {
it('returns an array of products', function (done) {
hippie(server)
.json()
.get('/products')
.expectStatus(200)
.end(function (err, res, body) {
if (err) throw err;
done();
});
});
});
});
但我总是收到以下错误:
测试名称:产品控制器测试/产品端点返回一系列产品
测试结果:失败
结果标准输出:
不行1产品控制器测试/产品端点返回一系列产品
TypeError:无法读取属性' apply'未定义的
在立即。 (C:\阿比\ node_modules \表达\ lib中\路由器\ index.js:618:14)
对这些控制器进行单元测试的最佳方法是什么?我应该使用不同的库吗?
答案 0 :(得分:0)
如何提取路线的行为和单位测试呢?
像这样的东西
var express = require('express'),
router = express.Router(),
routes = require('./routes');
router.get('/:id', routes.getId);
因此,在您的单元测试中,您可以
describe('getId', function() {
var route = require('../routes').getId;
var req = // build your request object with params and so on
var res = // stub this, for example with sinon
it('whatever', function() {
route(req, res);
expect(res.send.calledOnce).to.be.true;
// and so on
});
});
一旦你用单元测试覆盖它(运行速度更快,你可以将它们挂钩到预提交钩子上),你可以集成测试路由,而不需要模拟底层的HTTP库,使用正确的调用例如request
。