我在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挂钩:
sinon
isAuthenticated
auth.isAuthenticated
index.js
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如果由于某种原因需要获得原始行为,则需要创建另一个实例。