обрабатывать разные ответы, используя mocha в модульном тестировании nodejs - PullRequest
0 голосов
/ 28 июня 2018

мой тест получает passed (200 status code), когда я передаю правильную header информацию. но когда я пытаюсь с wrong info (400 status code), он не может справиться с этой ошибкой,

это мой код (здесь я передаю неверную информацию заголовков, поэтому ответом будет код состояния 400)

const chai = require('chai');
const expect = require('chai').expect;
const chaiHttp = require('chai-http');
chai.use(chaiHttp);
const main  = require('../server');
let token;
describe('GET USER', function()  {
  this.timeout(50000);
  it('Display info about user and returns a 200 response', (done) => {
    chai.request(main)
    .get('/users')
    .set("Authorization"," ")
    .then(function(response) {
      // Now let's check our response
      expect(response).to.have.status(200);
      done();
    })
    .catch((err)=>{
      expect(err.status).to.be.equal(400)
      done();
    })
  });
});

Я получаю такую ​​ошибку,

GET USER
(node:28390) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected undefined to equal 400
    1) Display info about user and returns a 200 response

  1 failing

  1) GET USER
       Display info about user and returns a 200 response:
     Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/test/users.test.js)

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Как уже упоминалось в другом ответе, вы не можете тестировать 200 и 400 одновременно.

Вызов done() до expect приведет к тайм-ауту теста, если утверждение не выполнено, поскольку оно выдает ошибку подтверждения и done никогда не вызывается. Это приводит к необработанному отклонению, потому что больше нет catch после catch.

chai-http поддерживает поток управления обещаниями . Mocha естественно обрабатывает обещания, тест должен возвращать обещание вместо использования done. Поскольку предлагает , ответ об ошибке может быть достигнут как err.response. Вероятно, должно быть:

describe('GET USER', function()  {
  it('should returns 400 response', () => {
    return chai.request(main)
    .get('/users')
    .set("Invalid header"," ")
    .catch(function(err) {
      expect(err.response.status).to.have.status(400);
    });
  });
});
0 голосов
/ 28 июня 2018

Кажется, здесь есть небольшое недоразумение: catch не выполняется, если chai-http получает ошибку HTTP. Он выполняется, если запрос не выполняется. Получение 200 или 400 должно быть как проверено в then, так и не поймано.

Как видно из сообщения об ошибке, объект err не имеет поля status, поскольку это не объект response, а экземпляр Error.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...