2014-12-15 4 views
1

Я пытаюсь написать тесты, чтобы гарантировать, что мой Экспресс-API правильно вернет правильные коды состояния HTTP для различных сценариев. Я использую Mocha и Supertest для запросов API в тестах. Сейчас я получаю очень неожиданные результаты, которые подробно описаны ниже.Ошибка «Body Parse» для теста 404 в Mocha + Supertest

Использование: Express, тело-парсер, Sequelize, мокко, Supertest

GET/пользователи /: 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' } в обратном вызове. res - undefined.

Я пробовал несколько различных форм синтаксиса для этого expect звонок: .expect(404, function(err, res) { и ни один из них не работал. Я также попытался все различные формы синтаксиса для этого, а также:

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

Может кто-нибудь предложить некоторое представление о том, что здесь происходит?

ответ

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; 
} 
Смежные вопросы