gpt4 book ai didi

node.js - 如何在 post 路由上模拟 Express/Node.js 中间件?

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:53 24 4
gpt4 key购买 nike

我正在用 chai 和 mocha 编写一些测试,但遇到了一些麻烦。例如,在我粘贴到此处的路由中,LOGOUT 调用 isLoggedIn 中间件来检查 session 中是否存在用户。例如,如果这样做:

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

非常感谢!!!

最佳答案

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

测试.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;

关于node.js - 如何在 post 路由上模拟 Express/Node.js 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60373158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com