Как смоделировать промежуточное ПО Express / Node.js на почтовом маршруте? - PullRequest
1 голос
/ 24 февраля 2020

Я пишу несколько тестов с Чай и Мокко, и у меня есть некоторые проблемы. Например, в маршруте, который я здесь вставляю, LOGOUT вызывает промежуточное ПО isLoggedIn, которое проверяет, существует ли пользователь в сеансе. Например, если сделать это:

  it('Logout', function(done) {
    chai.request(baseURL)
    .post('/logout')
    .end(function(err, res) {
      expect(err).to.be.null;
      expect(res).to.have.status(204);
      done();
    });
  });

, тест не пройдёт, потому что я получу код состояния 401. Я новичок в этом тесте. Я понимаю, что мне нужно использовать Sinon, чтобы пройти мой тест, но я не могу найти решение.

Это мой маршрут:

'use strict';

const express = require('express');
const createError = require('http-errors');
const router = express.Router();
const bcrypt = require('bcrypt');
const User = require('../models/User');

const {isLoggedIn} = require('../helpers/middlewares');

router.post('/logout', isLoggedIn(), (req, res, next) => {
	req.session.destroy();
	return res.status(204).send();
});

Это промежуточное ПО:

'use strict';

const createError = require('http-errors');

exports.isLoggedIn = () => (req, res, next) => {
  if (req.session.user) {
    next();
  } else {
    next(createError(401));
  };
};

Большое спасибо !!!

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

В вашем потоке проблема в том, что express промежуточное программное обеспечение инициализируется во время запуска приложения express и после становится недоступным для создания заглушек. Мое решение состоит в том, что будет инициализировать заглушку перед запуском express приложения.

test.spe c. js:

const chai = require("chai"),
    sinon = require("sinon"),
    chaiHttp = require("chai-http"),
    initServer = require("./initTestServer"),
    isLoggedInMiddleware = require("./middleware");

chai.use(chaiHttp);
const { expect } = chai;

describe("Resource: /", function() {
    before(function() {
        sinon.stub(isLoggedInMiddleware, "isLoggedIn").callsFake(function() {
            return (req, res, next) => {
                next();
            };
        });

        this.httpServer = initServer();
    });

    after(function() {
        this.httpServer.close();
    });

    describe("#POST /login", function() {
        beforeEach(function() {
            this.sandbox = sinon.createSandbox();
        });

        afterEach(function() {
            this.sandbox.restore();
        });

        it("- should login in system and return data", async function() {
            return chai
                .request(this.httpServer.server)
                .post("/logout")
                .end((err, res) => {
                    expect(err).to.be.null;
                    expect(res).to.have.status(204);
                });
        });
    });
});

initTestServer. js:

const isLoggedInMiddleware = require("./middleware");

const initServer = () => {
    const express = require("express");
    const app = express();

    app.post("/logout", isLoggedInMiddleware.isLoggedIn(), (req, res, next) => {
        return res.status(204).send();
    });

    const server = require("http").createServer(app);
    server.listen(3004);

    const close = () => {
        server.close();
        global.console.log(`Close test server connection on ${process.env.PORT}`);
    };

    return { server, close };
};

module.exports = initServer;
0 голосов
/ 24 февраля 2020

Спасибо, @EduardS за ответ! Я решил это аналогичным образом:

  it('Logout', async function(done) {
    sinon.stub(helpers, 'isLoggedIn')
    helpers.isLoggedIn.callsFake((req, res, next) => {
      return (req, res, next) => {
        next();
      };
    })
    app = require('../index')
    chai.request(app)
    .post('/api/auth/logout')
    .end(function(err, res2) {
      expect(res2).to.have.status(204);
      helpers.isLoggedIn.restore()
    })
    done();
  });
...