如何集成测试节点快速控制器?

时间:2015-11-12 15:05:11

标签: node.js unit-testing mocha

我们启动了一个节点应用程序,我们将使用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)

测试1

传递0

失败1

对这些控制器进行单元测试的最佳方法是什么?我应该使用不同的库吗?

1 个答案:

答案 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