即使响应正确,使用 supertest 和 jest 测试 API 错误也会失败

Jay*_*444 4 testing http node.js supertest jestjs

我正在使用jest 23.1.0supertest 3.1.0。我正在为后端编写一些测试,一切进展顺利,但是对于特定路由的特定情况,即使响应对象似乎包含正确的信息,测试也会失败。测试是检查参数是否是有效的 JSON,如下所示:

\n\n
describe(\'GET /graph\', () => {\n    it(\'invalid JSON\', (done) => {\n        request(app)\n            .get(\'/graph\')\n            .set(\'Accept\', \'application/json\')\n            .expect(\'Content-Type\', /json/)\n            .expect(415)\n            .then(done);\n        });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,我实际上根本没有发送任何参数,但即使我确实发送了一些无效的 JSON,问题也是一样的。无论如何,这两种情况都会触发相同的后端检查,即:

\n\n
module.exports = (req, res, next) => {\n\n    let dataParameters;\n    try {\n        dataParameters = JSON.parse(req.query.dataParameters);\n    }\n    catch(error) {\n        return(res.status(415).send({\n            message: "Request parameters are not a valid JSON object",\n            other: `${error.name} - ${error.message}`\n        }));\n    }\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我运行 jest 时,测试失败,控制台的输出如下:

\n\n
  GET /graph\n    \xe2\x9c\x95 invalid JSON (6ms)\n\n  \xe2\x97\x8f GET /graph \xe2\x80\xba invalid JSON\n\n    Failed: Object {\n      "header": Object {\n        "connection": "close",\n        "content-length": "125",\n        "content-type": "application/json; charset=utf-8",\n        "date": "Tue, 26 Jun 2018 13:58:48 GMT",\n        "etag": "W/\\"7d-GGhtZ8CfzWfmANZW28JTNC5bNjU\\"",\n        "x-powered-by": "Express",\n      },\n      "req": Object {\n        "data": undefined,\n        "headers": [Object],\n        "method": "GET",\n        "url": "http://127.0.0.1:35875/graph",\n      },\n      "status": 415,\n      "text": "{\\"message\\":\\"Request parameters are not a valid JSON object\\",\\"other\\":\\"SyntaxError - Unexpected token u in JSON at position 0\\"}",\n    }\n\n      at Env.fail (node_modules/jest-jasmine2/build/jasmine/Env.js:537:34)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,查看 jest 打印的对象,似乎路由返回了正确的 HTTP 状态和消息,但是实际测试本身失败了,而不是超级测试处理它。我使用相同的响应格式和测试技术来测试其他 API 错误,但这种情况不会发生。我尝试过更改request参数、错误代码和其他各种内容,但无济于事。

\n

Dan*_*man 5

我在将参数传递到 Done() 时遇到问题,导致类似的问题。

尝试改变你的

.then(done)

.then(() => { done() })

看看这是否适合你。