如何在Express中模拟中间件以跳过身份验证以进行单元测试?

我在Express中有以下内容

 //index.js

var service = require('./subscription.service');

var auth = require('../auth/auth.service');

var router = express.Router();

router.post('/sync', auth.isAuthenticated, service.synchronise);

module.exports = router;

我想覆盖或模拟isAuthenticated返回此

auth.isAuthenticated = function(req, res, next) { 

return next();

}

这是我的单元测试:

it('it should return a 200 response', function(done) {

//proxyquire here?

request(app).post('/subscriptions/sync')

.set('Authorization','Bearer '+ authToken)

.send({receipt: newSubscriptionReceipt })

.expect(200,done);

});

我已经尝试使用proxyquire嘲笑index.js-我想我需要对路由器存根吗?我也尝试在测试中改写

app.use('/subscriptions', require('./api/subscription'));

必须有一种简单的方法可以模拟这种情况,因此我不需要对请求进行身份验证。有任何想法吗?

回答:

您可以使用sinonto stub

isAuthenticated方法,但是应该auth.isAuthenticated在将对的引用设置为中间件之前进行此操作,因此在创建index.jsand

之前需要这样做app。您最有可能希望将其beforeEach挂钩:

var app;

var auth;

beforeEach(function() {

auth = require('../wherever/auth/auth.service');

sinon.stub(auth, 'isAuthenticated')

.callsFake(function(req, res, next) {

return next();

});

// after you can create app:

app = require('../../wherever/index');

});

afterEach(function() {

// restore original method

auth.isAuthenticated.restore();

});

it('it should return a 200 response', function(done) {

request(app).post('/subscriptions/sync')

.set('Authorization','Bearer '+ authToken)

.send({receipt: newSubscriptionReceipt })

.expect(200,done);

});

请注意,即使在auth.isAuthenticated还原后,现有app实例也将具有存根作为中间件,因此,app如果由于某种原因需要获得原始行为,则需要创建另一个实例。

以上是 如何在Express中模拟中间件以跳过身份验证以进行单元测试? 的全部内容, 来源链接: utcz.com/qa/399630.html

回到顶部