【问题标题】:Testing API error with supertest and jest fails even though response is correct即使响应正确,使用 supertest 和 jest 测试 API 错误也会失败
【发布时间】:2018-12-05 07:23:42
【问题描述】:

我正在使用jest 23.1.0supertest 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}`
        }));
    }
    ...

当我运行 jest 时,测试失败,控制台的输出是这样的:

  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)

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

【问题讨论】:

    标签: node.js http testing jestjs supertest


    【解决方案1】:

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

    尝试改变你的

    .then(done)

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

    看看能不能解决你的问题。

    【讨论】:

    • 非常感谢
    • 丹真是个好主意。
    猜你喜欢
    • 2021-08-11
    • 2021-12-22
    • 2020-04-15
    • 2016-06-23
    • 2014-10-10
    • 2021-10-21
    • 2018-12-17
    • 2020-11-23
    • 2019-07-31
    相关资源
    最近更新 更多