如何在 Mocha/Chai API 单元测试上模拟 req.session
How to mock req.session on Mocha/Chai API Unit Test
使用 Mocha/Chai 进行 REST API 单元测试,我需要能够模拟 req.session.someKey
一些端点。我该如何去嘲笑 req.session
?
我正在为使用 express-session 的 NodeJS Express 应用编写 REST API 单元测试。其中一些端点需要使用存储在 req.session.someKey
中的数据,如果 req.session.someKey
未定义,则端点设置为 return 400,因此我需要能够模拟它以便测试成功完成。
示例代码:
router.get('/api/fileSystems', utilities.apiAuth, (req, res) => {
let customer = req.session.customer;
let route = (customer === 'NONE') ? undefined : customer;
if(route == undefined){
res.status(400).send('Can't have customer of undefined');
} else {
let requestOptions = setRequestOptions(route);
queryFileSystemInfo(requestOptions, (info) => {
res.status(200).send(info);
});
}
});
我尝试过的:
describe('/GET /api/fileSystems', () => {
it('It should return information about the filesystem for a customer'), (done) => {
chai.request(server)
.get('api/fileSystems')
.set('customer', '146')
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
我试图使用 .set()
来设置 req.session 但我相信 .set 只是设置 headers 所以我不相信我可以更新它除非我遗漏了什么。
mock-session 完全可以用来模拟会话对象
let mockSession = require('mock-session');
describe('/GET /api/fileSystems', () => {
it('It should return information about the filesystem for a customer'), (done) => {
let cookie = mockSession('my-session', 'my-secret', {"count":1}); // my-secret is you session secret key.
chai.request(server)
.get('api/fileSystems')
.set('cookie',[cookie])
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
对于这个项目,我最终不得不在我们的 server.js 文件中设置 req.session.customer
,该文件有一个 app.use()
调用,该调用使用中间件函数来设置当前会话。我无法真正找到一个在测试时直接改变 req.session 对象的包。
在您的快速设置中,您通常会像这样插入会话中间件
app.use(session(config))
相反,您可以将会话中间件放在方便访问的位置,并为其制作一个包装器,如下所示:
app.set('sessionMiddleware') = session(config)
app.use((...args) => app.get('sessionMiddleware')(...args)
测试需要访问 express 实例,您可以通过重构 /app.js
导出函数来实现。
function app () {
const app = express()
// ... set up express
return app
}
// run app if module called from cli like `node app.js`
if (require.main === module) instance = app()
module.exports = app
然后在你的测试中,你可以覆盖app.sessionMiddleware
describe('/GET /api/fileSystems', () => {
it('It should return information about the filesystem for a customer'), (done) => {
app.set('sessionMiddleware') = (req, res, next) => {
req.session = mockSession // whatever you want here
next()
}
chai.request(server)
.get('api/fileSystems')
.set('customer', '146')
.end((err, res) => {
res.should.have.status(200);
done();
});
// then you can easily run assertions against your mock
chai.assert.equal(mockSession.value, value)
});
});
我在网上看到的其他选项涉及设置 cookie 以匹配存储在数据库中的会话,该方法的问题是您最终 运行 在会话时遇到问题在数据库中过期,因此随着固定装置变得陈旧,测试会随着时间的推移而失败。使用上面概述的方法,您可以通过在测试中设置到期时间来解决这个问题。
使用 Mocha/Chai 进行 REST API 单元测试,我需要能够模拟 req.session.someKey
一些端点。我该如何去嘲笑 req.session
?
我正在为使用 express-session 的 NodeJS Express 应用编写 REST API 单元测试。其中一些端点需要使用存储在 req.session.someKey
中的数据,如果 req.session.someKey
未定义,则端点设置为 return 400,因此我需要能够模拟它以便测试成功完成。
示例代码:
router.get('/api/fileSystems', utilities.apiAuth, (req, res) => {
let customer = req.session.customer;
let route = (customer === 'NONE') ? undefined : customer;
if(route == undefined){
res.status(400).send('Can't have customer of undefined');
} else {
let requestOptions = setRequestOptions(route);
queryFileSystemInfo(requestOptions, (info) => {
res.status(200).send(info);
});
}
});
我尝试过的:
describe('/GET /api/fileSystems', () => {
it('It should return information about the filesystem for a customer'), (done) => {
chai.request(server)
.get('api/fileSystems')
.set('customer', '146')
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
我试图使用 .set()
来设置 req.session 但我相信 .set 只是设置 headers 所以我不相信我可以更新它除非我遗漏了什么。
mock-session 完全可以用来模拟会话对象
let mockSession = require('mock-session');
describe('/GET /api/fileSystems', () => {
it('It should return information about the filesystem for a customer'), (done) => {
let cookie = mockSession('my-session', 'my-secret', {"count":1}); // my-secret is you session secret key.
chai.request(server)
.get('api/fileSystems')
.set('cookie',[cookie])
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
对于这个项目,我最终不得不在我们的 server.js 文件中设置 req.session.customer
,该文件有一个 app.use()
调用,该调用使用中间件函数来设置当前会话。我无法真正找到一个在测试时直接改变 req.session 对象的包。
在您的快速设置中,您通常会像这样插入会话中间件
app.use(session(config))
相反,您可以将会话中间件放在方便访问的位置,并为其制作一个包装器,如下所示:
app.set('sessionMiddleware') = session(config)
app.use((...args) => app.get('sessionMiddleware')(...args)
测试需要访问 express 实例,您可以通过重构 /app.js
导出函数来实现。
function app () {
const app = express()
// ... set up express
return app
}
// run app if module called from cli like `node app.js`
if (require.main === module) instance = app()
module.exports = app
然后在你的测试中,你可以覆盖app.sessionMiddleware
describe('/GET /api/fileSystems', () => {
it('It should return information about the filesystem for a customer'), (done) => {
app.set('sessionMiddleware') = (req, res, next) => {
req.session = mockSession // whatever you want here
next()
}
chai.request(server)
.get('api/fileSystems')
.set('customer', '146')
.end((err, res) => {
res.should.have.status(200);
done();
});
// then you can easily run assertions against your mock
chai.assert.equal(mockSession.value, value)
});
});
我在网上看到的其他选项涉及设置 cookie 以匹配存储在数据库中的会话,该方法的问题是您最终 运行 在会话时遇到问题在数据库中过期,因此随着固定装置变得陈旧,测试会随着时间的推移而失败。使用上面概述的方法,您可以通过在测试中设置到期时间来解决这个问题。