1

我正在尝试编写测试以确保我的 Express API 为各种场景正确返回正确的 HTTP 状态代码。我在测试中使用 Mocha 和Supertest来请求 API。现在我得到了非常意想不到的结果,下面详细介绍。

使用:Express、body-parser、Sequelize、Mocha、Supertest

获取 /users/:id

  models.User.find(req.params.id).complete(function(err, foundUser) {
    if (err) {
      logger.error(err, 'Error');
      return err;
    }

    console.log('user: ' + foundUser);
    if (foundUser != null) {
      res.json({ user: foundUser.getJsonRepresentation() });
    }
    else {
      res.status(404);
      res.json({ error: 'Not found' });
    }
  });

测试此方法

it('responds with the right user', function(done){
      request(app)
        .get(apiPath + '/users/' + createdUser.id)
        .set('Accept', 'application/json')
        .expect(function(res) {
          res.body.user.id.should.equal(createdUser.id);
        })
        .expect(200, done);
    });

    it('responds with the right error code for non-existent resource', function(done) {
      request(app)
        .get(apiPath + '/users/1000')
        .expect(404, function(err, res) {
          console.log(err);
          console.log('Response: ' + res);
          done();
        });
    });

对于 404 测试,我收到此错误:{ [Error: Parse Error] bytesParsed: 12, code: 'HPE_INVALID_STATUS' }在回调中。resundefined。_

我为这个expect调用尝试了几种不同的语法形式:.expect(404, function(err, res) {但没有一个有效。我也为此尝试了所有不同的语法形式:

res.status(404);
res.json({ error: 'Not found' });

任何人都可以对这里发生的事情提供一些见解吗?

4

1 回答 1

2

也许问题出在以下代码片段中:

if (err) {
  logger.error(err, 'Error');
  return err;
}

它似乎触发了错误,但实际上并未将其返回给supertest客户端。

您可以尝试将错误返回给客户端,而不是只记录它,如下所示:

if (err) {
  logger.error(err, 'Error');

  res
    .status(500);
    .json({ error: error.message });
  return err;
}
于 2014-12-15T23:58:57.510 回答