min*_*rse 6 node.js express supertest
我刚刚开始在我的快速应用程序中使用中间件supertest并nock为其编写单元测试。
首先检查我的路由器设置处理的所有请求是否存在会话属性(我正在使用Express-Session)。
app.use('/api', helpers.hasAccessToken, require('./routes.js'));
Run Code Online (Sandbox Code Playgroud)
助手只是这样做:
module.exports.hasAccessToken = function(req, res, next) {
if(req.session.accessToken){
next();
} else {
res.status(401).send('LOGIN_SESSION_ENDED');
}
};
Run Code Online (Sandbox Code Playgroud)
在我的测试规范中,我有:
var app = require('./index.js'),
request = require('supertest')(app),
expect = require('chai').expect,
nock = require('nock');
describe('GET requests', function(){
beforeEach(function(){
nock('https://somedomain:port')
.get('/someendpoint')
.reply(200, {foo:'bar'});
});
it('should return a 200 HTTP status code', function(done){
request
.get('/api/someendpoint')
.end(function(err, res){
expect(res.status).to.equal(200);
done();
});
});
});
Run Code Online (Sandbox Code Playgroud)
相反,将返回状态为401的错误,我知道req.session.accessToken这取决于运行测试之前未设置的属性。
那么,如何才能使该req对象对会话对象执行我喜欢的操作?
谢谢
工作流程是:用户登录 =>req.session.accessToken在服务器端设置 => 使用set-cookie响应标头(由 cookie 设置的 cookie express-session)响应客户端 => 使用 cookie 调用受保护的/api/someendpoint端点accessToken。=> 调用hasAccessToken中间件 => 其余代码逻辑。
这是解决方案:
\n\napp.js:
const express = require("express");\nconst session = require("express-session");\nconst helpers = require("./helpers");\nconst app = express();\n\napp.set("trust proxy", 1);\napp.use(\n session({\n secret: "keyboard cat",\n resave: false,\n saveUninitialized: true,\n }),\n);\n\napp.post("/signin", (req, res) => {\n req.session.accessToken = "123123";\n console.info("signin success");\n res.status(200).end();\n});\n\napp.use("/api", helpers.hasAccessToken, require("./routes"));\n\nconst server = app.listen(3000, () => {\n console.info(`HTTP server is listening on http://localhost:${server.address().port}`);\n});\n\nmodule.exports = server;\nRun Code Online (Sandbox Code Playgroud)\n\nhelpers.js:
module.exports.hasAccessToken = function(req, res, next) {\n console.log("req.session.accessToken", req.session.accessToken);\n if (req.session.accessToken) {\n next();\n } else {\n res.status(401).send("LOGIN_SESSION_ENDED");\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n\nroutes.js:
const { Router } = require("express");\n\nconst router = Router();\n\nrouter.get("/someendpoint", (req, res) => {\n res.sendStatus(200);\n});\n\nmodule.exports = router;\nRun Code Online (Sandbox Code Playgroud)\n\napp.test.js:
const app = require("./app");\nconst request = require("supertest");\nconst expect = require("chai").expect;\n\ndescribe("GET requests", function() {\n const agent = request(app);\n let cookies;\n\n before((done) => {\n agent.post("/signin").expect(200, (err, res) => {\n if (err) return done(err);\n expect(res.headers).to.have.property("set-cookie");\n cookies = res.headers["set-cookie"].pop().split(";")[0];\n done();\n });\n });\n after((done) => {\n app.close(done);\n });\n\n it("should return a 200 HTTP status code", function(done) {\n console.log(cookies);\n agent\n .get("/api/someendpoint")\n .set("Cookie", [cookies])\n .end(function(err, res) {\n if (err) return done(err);\n expect(res.status).to.equal(200);\n done();\n });\n });\n});\nRun Code Online (Sandbox Code Playgroud)\n\n集成测试结果与覆盖率报告:
\n\nHTTP server is listening on http://localhost:3000\n GET requests\nsignin success\nconnect.sid=s%3Ahw94RpxRocC4hMTkCmMx4Ot85aGYG6s5.eE91ELDNjuQ1fWqEsRZdwtwKokLXR6%2Bao9NGdvl%2Bflc\nreq.session.accessToken 123123\n \xe2\x9c\x93 should return a 200 HTTP status code\n\n\n 1 passing (33ms)\n\n-------------|----------|----------|----------|----------|-------------------|\nFile | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |\n-------------|----------|----------|----------|----------|-------------------|\nAll files | 93.33 | 50 | 100 | 97.67 | |\n app.js | 100 | 100 | 100 | 100 | |\n app.test.js | 90.48 | 50 | 100 | 100 | 11,27 |\n helpers.js | 80 | 50 | 100 | 80 | 6 |\n routes.js | 100 | 100 | 100 | 100 | |\n-------------|----------|----------|----------|----------|-------------------|\nRun Code Online (Sandbox Code Playgroud)\n\n源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/39118250
\n| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |