我正在尝试测试几乎完全相同的两条路线,除了其中一条路线更具体,因为最新的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');
}
答案 0 :(得分:0)
这是可以预料的。
Express将按照它们在app
对象中注册的顺序执行与给定URL匹配的所有路由。要绕过任何后续回调,您可以使用next('route')
。有关详细信息,请参阅application routing in the express API guide部分。
答案 1 :(得分:0)
尝试将'show'放在回调函数中,然后调用'edit'完成