【问题标题】:How to get response body from Express.js server using Supertest?如何使用 Supertest 从 Express.js 服务器获取响应正文?
【发布时间】:2022-02-10 22:21:56
【问题描述】:

我开始为我的应用程序编写一些测试,但我在读取/获取服务器响应时遇到了问题。我尝试了很多东西,但都没有真正奏效,有人可以帮帮我吗?

// /api/checkCreds
exports.checkCreds = async function(req, res){
//validation
if(!await User.checkCreds(req.body.username, req.body.password)){
    var result = {error: true, data: "Incorrect"}
    res.sendStatus = 401;
    return res.send(JSON.stringify(result));        
}

如果发送到服务器的凭据不匹配,则向用户返回带有“不正确”消息的响应。 在测试中,我试图从服务器获取数据以检查属性是否与预期输出匹配。

    //test.js
    it("We should fail with HTTP code 401 because incorrect data is passed (username='incorrect' password='incorrect')", function(done){
       supertest(app)
       .post('/api/checkCreds')
       .send({username: 'incorrect', password: 'incorrect'})
       .expect({error: true, data: "Incorrect"})
       .expect(401, done);
   });

运行时,测试失败,因为预期的属性与服务器发送的响应不同,它是一个空对象 {}。

感谢任何帮助。

【问题讨论】:

    标签: node.js express supertest


    【解决方案1】:

    您可以尝试更改您的第一个期望,看看您是否可以诱使超测向您展示与它进行比较的实际身体。例如expect('')

    如果这不起作用,则有一个接受函数的expect 版本。在该函数中,您应该能够打印出您在响应正文中得到的内容,即。 console.log(res).

    可能是 JSON 返回类型存在一些混淆——我没有直接使用它。您可以尝试期待 JSON。

    最后,文档中有一段我认为不适用的奇怪段落,但我想我会提到:

    上述语句需要注意的一点是,如果您不添加状态码 expect(即 .expect(302 ))。

    【讨论】:

    • 我尝试使用 expect(' ') 作为我的第一个期望,但只收到一个错误消息:“预期 ' ' 响应正文,未授权。我试图在里面的函数中打印 res.body期待,但我开篇文章中的问题仍然存在。最后,在 /api/checkCreds 我删除了 JSON.stringify() 但问题仍然存在。
    • 您是否尝试过expect(401)?似乎大多数示例都是这样做的。
    • 我尝试将 expect(401) 作为我的第一个期望,但问题仍然存在。
    • 抱歉,从远处调试有点困难。你可能想从一个简单的例子开始——也许直接来自超测文档,并确保它有效。然后,一次改变一件事,朝着理想的测试迈进。这应该可以让您隔离问题。
    • 不用担心,我设法解决了我的问题,如果有人遇到与我相同的问题,我将发布一个新的帖子以供将来参考。
    【解决方案2】:

    在尝试解决我的问题时,我注意到在 HTTP 响应中,Content-Type 标头设置为 text/plain,而我的服务器正在返回 JSON,所以这可能是混淆 supertest 的原因。

    我认为res.send() 默认情况下将标头设置为text/plain,我必须使用res.type('json') 手动将标头值设置为application/json。那时我能够毫无问题地阅读响应正文。 我还了解到res.json() 默认情况下将Content-Type 标头设置为application/json,因此您不需要像res.send() 那样手动执行此操作。

    工作代码:

    // /api/checkCreds
    if(!await User.checkCreds(req.body.username, req.body.password)){
        var result = {error: true, data: "Incorrect"}
        return res.status(401).json(result);       
    }
    
    //test.js
    it("We should fail with HTTP code 401 because incorrect data is passed (username='incorrect' password='incorrect')", function(done){
        supertest(app)
        .post('/api/checkCreds')
        .set('Content-type', 'application/json')
        .send({username: 'incorrect', password: 'incorrect'})
        .expect(401)
        .expect(function(res){
            console.log(res.body);
        })
        .end(done); 
    });
    

    如果我说的不完全正确,请随时纠正我。

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多