使用 supertest 和 jest 测试 API 错误失败,即使响应是正确的
Testing API error with supertest and jest fails even though response is correct
我正在使用 jest 23.1.0
和 supertest 3.1.0
。我正在为我的后端编写一些测试并且一切正常,但是对于特定路由的特定情况,即使响应对象似乎包含正确的信息,测试也会失败。测试是检查参数是否有效JSON,并且是这样的:
describe('GET /graph', () => {
it('invalid JSON', (done) => {
request(app)
.get('/graph')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(415)
.then(done);
});
});
在这种情况下,我实际上根本没有发送任何参数,但即使我确实发送了一些无效的 JSON,问题也是一样的。这两种情况无论如何都会触发相同的后端检查,即:
module.exports = (req, res, next) => {
let dataParameters;
try {
dataParameters = JSON.parse(req.query.dataParameters);
}
catch(error) {
return(res.status(415).send({
message: "Request parameters are not a valid JSON object",
other: `${error.name} - ${error.message}`
}));
}
...
当我运行开玩笑时,测试失败,控制台的输出是这样的:
GET /graph
✕ invalid JSON (6ms)
● GET /graph › invalid JSON
Failed: Object {
"header": Object {
"connection": "close",
"content-length": "125",
"content-type": "application/json; charset=utf-8",
"date": "Tue, 26 Jun 2018 13:58:48 GMT",
"etag": "W/\"7d-GGhtZ8CfzWfmANZW28JTNC5bNjU\"",
"x-powered-by": "Express",
},
"req": Object {
"data": undefined,
"headers": [Object],
"method": "GET",
"url": "http://127.0.0.1:35875/graph",
},
"status": 415,
"text": "{\"message\":\"Request parameters are not a valid JSON object\",\"other\":\"SyntaxError - Unexpected token u in JSON at position 0\"}",
}
at Env.fail (node_modules/jest-jasmine2/build/jasmine/Env.js:537:34)
因此,看着对象开玩笑地打印出来,路由似乎正在返回正确的 HTTP 状态和消息,但是实际测试本身并没有处理它,而是失败了。我使用相同的响应格式和测试技术来测试其他 API 错误,但并没有发生这种情况。我试过更改 request
参数、错误代码和各种其他内容,但无济于事。
我在将参数传递给 Done() 时遇到过问题,导致了类似的问题。
尝试改变你的
.then(done)
到
.then(() => { done() })
看看是否能为您解决问题。
我正在使用 jest 23.1.0
和 supertest 3.1.0
。我正在为我的后端编写一些测试并且一切正常,但是对于特定路由的特定情况,即使响应对象似乎包含正确的信息,测试也会失败。测试是检查参数是否有效JSON,并且是这样的:
describe('GET /graph', () => {
it('invalid JSON', (done) => {
request(app)
.get('/graph')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(415)
.then(done);
});
});
在这种情况下,我实际上根本没有发送任何参数,但即使我确实发送了一些无效的 JSON,问题也是一样的。这两种情况无论如何都会触发相同的后端检查,即:
module.exports = (req, res, next) => {
let dataParameters;
try {
dataParameters = JSON.parse(req.query.dataParameters);
}
catch(error) {
return(res.status(415).send({
message: "Request parameters are not a valid JSON object",
other: `${error.name} - ${error.message}`
}));
}
...
当我运行开玩笑时,测试失败,控制台的输出是这样的:
GET /graph
✕ invalid JSON (6ms)
● GET /graph › invalid JSON
Failed: Object {
"header": Object {
"connection": "close",
"content-length": "125",
"content-type": "application/json; charset=utf-8",
"date": "Tue, 26 Jun 2018 13:58:48 GMT",
"etag": "W/\"7d-GGhtZ8CfzWfmANZW28JTNC5bNjU\"",
"x-powered-by": "Express",
},
"req": Object {
"data": undefined,
"headers": [Object],
"method": "GET",
"url": "http://127.0.0.1:35875/graph",
},
"status": 415,
"text": "{\"message\":\"Request parameters are not a valid JSON object\",\"other\":\"SyntaxError - Unexpected token u in JSON at position 0\"}",
}
at Env.fail (node_modules/jest-jasmine2/build/jasmine/Env.js:537:34)
因此,看着对象开玩笑地打印出来,路由似乎正在返回正确的 HTTP 状态和消息,但是实际测试本身并没有处理它,而是失败了。我使用相同的响应格式和测试技术来测试其他 API 错误,但并没有发生这种情况。我试过更改 request
参数、错误代码和各种其他内容,但无济于事。
我在将参数传递给 Done() 时遇到过问题,导致了类似的问题。
尝试改变你的
.then(done)
到
.then(() => { done() })
看看是否能为您解决问题。