4

最新のURLセグメントがハードコードされた値(編集)であり、もう一方がパラメーター(:slug)を持っているため、一方がより具体的であることを除いて、ほとんど同じ2つのルートをテストしようとしています。

私が経験している問題は、リクエストが実行されると、両方のルート(edit、show)が呼び出され、モックの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

それは予想されることです。

Express は、指定された URL に一致するすべてのルートを、appオブジェクトに登録された順序で実行します。以降のコールバックをバイパスするには、 を使用できますnext('route')詳細については、エクスプレス API ガイドのアプリケーション ルーティングに関するセクションを参照してください。

于 2012-12-23T16:57:31.483 に答える
0

あなたの「ショー」を関数のコールバックに入れてから、「編集」を行ってみてください

于 2013-05-07T05:15:08.267 に答える