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

时间:2017-02-02 06:21:27

标签: node.js express mocha sinon proxyquire

我在Express

中有以下内容
02-02 11:35:01.140 17483-17483/com.example.tiger.servertest V/students: [Student One]
02-02 11:35:01.140 17483-17483/com.example.tiger.servertest V/students: [Student two, Student two]

我想覆盖或模拟isAuthenticated以返回此

 //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;

这是我的单元测试:

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

我尝试使用proxyquire模拟index.js - 我想我需要存根路由器? 我也试图在测试中覆盖

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);
});

必须有一种简单的方法来模拟这一点,因此我不需要对请求进行身份验证。有什么想法吗?

1 个答案:

答案 0 :(得分:21)

您可以使用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实例出于某种原因。