有没有方便的方法来为单元测试中间件模拟HTTP请求和响应对象?
有没有方便的方法来为单元测试中间件模拟HTTP请求和响应对象?
看起来可以使用https://github.com/howardabrams/node-mocks-http和https://github.com/vojtajina/node-mocks来创建模拟的http.ServerRequest
和http.ServerResponse
对象。
从标签上看,这个问题似乎是关于 Express 的。如果是这样的话,supertest 是非常好用的:
var request = require('supertest')
, express = require('express');
var app = express();
app.get('/user', function(req, res){
res.send(201, { name: 'tobi' });
});
request(app)
.get('/user')
.expect('Content-Type', /json/)
.expect('Content-Length', '20')
.expect(201)
.end(function(err, res){
if (err) throw err;
});
对于一般的Node使用,Flatiron Nock似乎是一个不错的选择:
var nock = require('nock');
var example = nock('http://example.com')
.get('/foo')
.reply(200, { foo: 'bar' });
var http = require('http');
var options = {
host: 'example.com',
port: 80,
path: '/foo',
method: 'GET'
}
var req = http.request(options, function(res) {
res.on('data', function(chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function(e) {
console.log('error: ' + e);
});
req.end();
输出:
正文:{"foo":"bar"}
supertest
,它有 request(app)
,似乎启动了一个服务器(https://github.com/tj/supertest/blob/master/index.js#L20),并且它没有模拟 HTTP 请求。这是真的吗? - NullSpaceexpress.Request
和 express.Response
对象注入到请求函数中,或者在这种情况下,注入到您的中间件中。其中一个看起来提供了最少的方法,同时保持简单,对我来说是 @jest-mock/express。supertest
或 nock
,则正在进行集成测试,这可能会耦合多个测试。我还会研究一下它的内部工作方式,因为一旦停止工作,调试将会很麻烦。it('should call next',
async () => {
const req = getMockReq({
headers: {
'user-agent': 'Chrome',
},
path: '/path',
})
const{res, next, clearMockRes} = getMockRes({})
await middleware(req, res, next)
expect(res.send).not.toHaveBeenCalledWith()
expect(next).toHaveBeenCalled()
})
请查看https://github.com/timsavery/node-hmock 或者 npm install hmock
...欢迎任何反馈!这个解决方案到目前为止对我很有效。
我不建议在实际使用中使用这个解决方案,但这是我在实验中避免异常的hack方法。
const mock_response_obj = {
statusCode: null,
setHeader: () => {},
writeHead: () => {},
end: () => {},
}
显然需要根据需要进行扩展。分享给其他人,以防有人正在寻找简单的临时解决方案。