Node JS使用Mocha Chai测试受保护的路由?

时间:2019-01-31 14:20:51

标签: javascript node.js express mocha chai

该功能检查路由是否可访问

function isSessionCookieValid(req, res, next) {
      if (!isValid(req.session)) {
        return res.status(401).json({
          isLoggedIn: false
        });
      }
        return next();
 }

在另一个文件中,我使用上述功能发出了一个后继请求,这是一条受保护的路线

  app
     .route('/url')
     .post(utils.isSessionCookieValid, (req, res, next) => {})

测试部分

问题是我不知道如何模拟 isSessionCookieValid ,因为它需要下一个,但无法通过我的测试中的下一个回调:

describe('testing routes', () => {
  it('should enter the route body', (done) => {
    utils.isSessionCookieValid(req, res, 'next should be here...');
    chai.request(server)
      .post('/url')
      .end(function (error, response, body) {
        if (error) {
          done(error);
        } else {
          done();
        }
      });
  });

});

错误:TypeError:下一个不是函数

1 个答案:

答案 0 :(得分:1)

我将使用sinonjs作为模拟库。模拟isSessionCookieValid中间件的实现,让它始终转到下一个中​​间件。

例如

server.ts

import express from 'express';
import * as utils from './utils';

const app = express();
const port = 3000;

app.route('/url').post(utils.isSessionCookieValid, (req, res, next) => {
  res.sendStatus(200);
});

if (require.main === module) {
  app.listen(port, () => {
    console.log(`Server is listening on port ${port}`);
  });
}

export { app };

utils.ts

function isSessionCookieValid(req, res, next) {
  if (!isValid(req.session)) {
    return res.status(401).json({
      isLoggedIn: false,
    });
  }
  return next();
}

function isValid(session) {
  return true;
}

export { isSessionCookieValid };

server.test.ts

import * as utils from './utils';
import sinon from 'sinon';
import chai, { expect } from 'chai';
import chaiHttp from 'chai-http';

chai.use(chaiHttp);

describe('testing routes', () => {
  it('should enter the route body', (done) => {
    const isSessionCookieValidStub = sinon.stub(utils, 'isSessionCookieValid').callsFake((req, res, next) => {
      next();
    });
    const { app } = require('./server');
    chai
      .request(app)
      .post('/url')
      .end((error, response) => {
        if (error) {
          return done(error);
        }
        sinon.assert.calledOnce(isSessionCookieValidStub);
        expect(response).to.have.status(200);
        done();
      });
  });
});

单元测试结果:

  testing routes
    ✓ should enter the route body (500ms)


  1 passing (510ms)

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |      60 |       25 |      25 |      60 |                   
 server.ts |      80 |       50 |      50 |      80 | 12-13             
 utils.ts  |      20 |        0 |       0 |      20 | 2-11              
-----------|---------|----------|---------|---------|-------------------

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/54462600