Подтвердить что ты не робот

Как получить фактическую ошибку сервера при запуске 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');
    });

   ...
  })
});

Когда код сервера вызывает какое-либо исключение (например, доступ к свойствам объекта undefined), я получаю эту трассировку стека

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". Как я могу получить фактическую ошибку?

4b9b3361

Ответ 1

Вероятно, есть много способов справиться с этим, но я не считаю, что мокко или supertest имеют доступ к фактической ошибке, которая вызвала 500.

Что вы используете для создания app? Если в ходе тестирования Express Express можно выразить, например, промежуточное программное обеспечение обработки ошибок, которое вызывает запись на консоль любых 500-индуцирующих ошибок.

Ответ 2

Вы можете прослушать тестовый код для события uncaughtException, которое будет вызвано процессом. Пока экспресс-приложение выполняет всю свою обработку в том же процессе, что и тестовая проводка, любое необработанное исключение в процессе будет отправлено процессу обработчика события 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');
    });

   ...
  })
});