【发布时间】:2021-03-10 16:30:49
【问题描述】:
我有一个 hello world 应用程序,如下所示:
let clientAuthMiddleware = () => (req, res, next) => {
if (!req.client.authorized) {
return res.status(401).send('Invalid client certificate authentication.');
}
return next();
};
function app() {
const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();
app.use(clientAuthMiddleware());
app.get('/', (req, res) => {
console.log(req.socket.getPeerCertificate());
return res.send('Hello world!');
});
https
.createServer(
{
cert: fs.readFileSync('cert/localhost.crt'),
key: fs.readFileSync('cert/localhost.key'),
requestCert: true,
rejectUnauthorized: false,
ca: fs.readFileSync('cert/ca.crt'),
},
app
)
.listen(9443);
return app;
}
if (require.main === module) instance = app()
module.exports.app = app
module.exports.authMiddleware = clientAuthMiddleware
还有一个看起来像这样的测试:
describe('GET /', function() {
it('should return Hello world!', function(done) {
chai.request(app.app()).get('/')
.end((err, res) => {
if (err)done(err);
res.should.have.status(200);
expect(res.body).to.equal('Hello world!');
done();
});
});
});
如何在测试中替换 authMiddleware,最好不使用一些外部存根库?有没有什么方法可以让我重新排列我的代码,所以在测试中我可以只做 app.authMiddleware = {my own stub function} 吗?
编辑:另外,有没有一种方法可以直接对这些端点进行单元测试,例如 app.get('/') 而无需发出真正的 HTTP 请求?我一直在 Google 上搜索使用 Mocha 对 Node/Express 进行单元测试,我发现的每一个资源似乎都是功能测试,提出了一个真正的请求......
【问题讨论】:
-
如果我理解正确,您正在寻找一个可以执行
nock的库。也许如果它符合您的需求,我可以分享一个例子。我这么说是因为你说:最好不使用一些外部存根库。 -
@Danizavtz 我对 Node 比较陌生,但我的理解是 nock 是为了模拟外部 HTTP 请求,我想测试我自己的 Express 应用程序的端点,而不需要它实际启动服务器,监听并提出真正的要求。
标签: javascript node.js express mocha.js chai