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