supertest和类似路线的多次执行

时间:2012-12-16 06:03:32

标签: node.js express sinon supertest

我正在尝试测试几乎完全相同的两条路线,除了其中一条路线更具体,因为最新的url段是硬编码值(edit),而另一条路径是参数(:slug)。

我遇到的问题是,当请求被执行时,它将调用两个路由(编辑,显示)导致我的模拟never()期望永远不会通过:(

我做错了吗?我不明白为什么两条路线都在执行,如果其中一条更具体......

这是测试:

var request = require('supertest')
    , express = require('express')


describe('routes', function() {
    it('should call only edit', function(done) {
        var usersController = require('./users-controller');
        var sandbox = require('sinon').sandbox.create();
        var mockController = sandbox.mock(usersController);

        mockController.expects('edit').yields(null).once();
        mockController.expects('show').never();

        var app = express();

        app.get('/users/:id/edit', usersController.edit);
        app.get('/users/:id/:slug', usersController.show);

        request(app)
          .get('/users/123/edit')
          .end(function(err, res){
            if (err) throw err;
            mockController.verify();
            done();
          });
    });
});

这是 users-controlle.js 我在上面嘲笑:

exports.edit = function(req, res, next) {
    res.send('edit');
}

exports.show = function(req, res, next) {
    res.send('show');
}

2 个答案:

答案 0 :(得分:0)

这是可以预料的。

Express将按照它们在app对象中注册的顺序执行与给定URL匹配的所有路由。要绕过任何后续回调,您可以使用next('route')。有关详细信息,请参阅application routing in the express API guide部分。

答案 1 :(得分:0)

尝试将'show'放在回调函数中,然后调用'edit'完成