编写使用supertest的测试时访问req.session对象

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对象对会话对象执行我喜欢的操作?

谢谢

sli*_*wp2 1

工作流程是:用户登录 =>req.session.accessToken在服务器端设置 => 使用set-cookie响应标头(由 cookie 设置的 cookie express-session)响应客户端 => 使用 cookie 调用受保护的/api/someendpoint端点accessToken。=> 调用hasAccessToken中间件 => 其余代码逻辑。

\n\n

这是解决方案:

\n\n

app.js:

\n\n
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;\n
Run Code Online (Sandbox Code Playgroud)\n\n

helpers.js:

\n\n
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};\n
Run Code Online (Sandbox Code Playgroud)\n\n

routes.js:

\n\n
const { Router } = require("express");\n\nconst router = Router();\n\nrouter.get("/someendpoint", (req, res) => {\n  res.sendStatus(200);\n});\n\nmodule.exports = router;\n
Run Code Online (Sandbox Code Playgroud)\n\n

app.test.js:

\n\n
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});\n
Run Code Online (Sandbox Code Playgroud)\n\n

集成测试结果与覆盖率报告:

\n\n
HTTP 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-------------|----------|----------|----------|----------|-------------------|\n
Run Code Online (Sandbox Code Playgroud)\n\n

源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/39118250

\n