在mocha中运行supertest时如何获得实际的服务器错误?

时间:2016-01-09 22:04:51

标签: node.js mocha supertest

我有使用supertest和mocha的代码:

import request from 'supertest';

//....

var newGame;
describe('Creating game', function() {
  beforeEach(function(done) {
    request(app)
      .post('/api/games')
      .send({
        owner: 'Mr. X',
      })
      .expect(201)
      .expect('Content-Type', /json/)
      .end((err, res) => {
        if (err) {
          return done(err);
        }
        newGame = res.body;
        done();
      });
  });    

  describe('the created game', function() {

    it('should name the specified owner', function() {
      newGame.owner.should.equal('Mr. X');
    });

   ...
  })
});

当服务器代码抛出一些异常(例如访问未定义对象的属性)时,我得到了这个堆栈跟踪

Error: expected 201 "Created", got 500 "Internal Server Error"
  at Test._assertStatus (D:\Codes\theApp\node_modules\supertest\lib\test.js:232:12)
  at Test._assertFunction (D:\Codes\theApp\node_modules\supertest\lib\test.js:247:11)
  at Test.assert (D:\Codes\theApp\node_modules\supertest\lib\test.js:148:18)
  at Server.assert (D:\Codes\theApp\node_modules\supertest\lib\test.js:127:12)
  at emitCloseNT (net.js:1521:8)

而不是实际的错误,表示类似"访问undefined"的属性。我怎样才能得到实际的错误?

3 个答案:

答案 0 :(得分:0)

可能有很多方法可以解决这个问题,但我不相信摩卡或超级用户能够获得导致500出现的实际错误。

您在创建app时使用了什么?例如,如果它是Express,则可以在测试期间添加error-handling middleware,这会导致任何500诱导错误被记录到控制台。

答案 1 :(得分:0)

您可以让测试代码侦听进程将引发的 uncaughtException 事件。只要express应用程序在与测试工具相同的进程中完成所有处理,任何未处理的异常都将被发送到进程uncaughtException事件处理程序。现在,这里可能会有点棘手。因为,基于它的事件,它可以在任何时候被解雇,有一个未处理的异常。因此,如果您希望更明确并且只想处理被测系统中的异常,则需要在运行测试系统之前/之后添加/删除侦听器。这里更新了您的示例,以侦听未处理的异常。

import request from 'supertest';

//....

var newGame;
describe('Creating game', function() {
  beforeEach(function(done) {
    var unhandledException = undefined;
    var unhandledExceptionCallback = function(err) {
        unhandledException = err;
    }
    process.on('uncaughtException', unhandledExceptionCallback);
    request(app)
      .post('/api/games')
      .send({
        owner: 'Mr. X',
      })
      .expect(201)
      .expect('Content-Type', /json/)
      .end((err, res) => {
        process.removeListener('uncaughtException', unhandledExceptionCallback);
        if (unhandledException !== undefined){
          return done(unhandledException);
        } else if (err) {
          return done(err);
        }
        newGame = res.body;
        done();
      });
  });    

  describe('the created game', function() {

    it('should name the specified owner', function() {
      newGame.owner.should.equal('Mr. X');
    });

   ...
  })
});

答案 2 :(得分:0)

我认为这是一个api设计问题。 api应该为客户端提供有用的错误信息,尤其是如果客户端输入的差异导致服务器端错误。

您可以在您的端点中或在某些中间件中进行全局操作。