【问题标题】:How to mock an Express/Node.js middleware on a post route?如何在 post 路由上模拟 Express/Node.js 中间件?
【发布时间】:2020-02-24 09:44:49
【问题描述】:

我正在用 chai 和 mocha 编写一些测试,但遇到了一些麻烦。 例如,在我粘贴到这里的路由中,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 才能获得 mi 测试通过,但我无法得到解决方案。

这是我的路线:

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

非常感谢!!!

【问题讨论】:

    标签: node.js unit-testing mocha.js chai sinon


    【解决方案1】:

    在您的流程问题中,在运行 express 应用程序期间初始化的 express 中间件以及之后变得不可用于存根。我的解决方案是在运行 express 应用程序之前初始化存根。

    test.spec.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;
    

    【讨论】:

      【解决方案2】:

      谢谢@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();
        });
      

      【讨论】:

        猜你喜欢
        • 2017-07-12
        • 1970-01-01
        • 2015-02-27
        • 2021-09-29
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2019-07-20
        • 2018-10-02
        相关资源
        最近更新 更多