4

我正在尝试测试两条几乎相同的路线,除了其中一条更具体,因为最新的 url 段是硬编码值(编辑),而另一条有参数(: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');
}
4

2 回答 2

0

尝试将您的“显示”放在回调函数中,然后“编辑”完成

于 2013-05-07T05:15:08.267 回答
0

这是可以预料的。

appExpress 将按照在对象中注册的顺序执行与给定 URL 匹配的所有路由。要绕过任何以后的回调,您可以使用next('route'). 有关详细信息,请参阅express API 指南中有关应用程序路由的部分。

于 2012-12-23T16:57:31.483 回答