супертест и многократное выполнение однотипных маршрутов

Я пытаюсь протестировать два маршрута, которые почти одинаковы, за исключением того, что один из них более конкретен, поскольку последний сегмент 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');
}

person user1796747    schedule 16.12.2012    source источник


Ответы (2)


Этого следовало ожидать.

Express выполнит все маршруты, которые соответствуют заданному URL-адресу, в том порядке, в котором они были зарегистрированы с помощью объекта app. Чтобы обойти любые более поздние обратные вызовы, вы можете использовать next('route'). Дополнительные сведения см. в разделе маршрутизации приложений в руководстве по Express API.

person tomtheguvnor    schedule 23.12.2012

Попробуйте поместить свое «шоу» в обратный вызов в вызываемой функции, а затем «отредактировать»

person IvanM    schedule 07.05.2013