Тест REST API с Mocha & Chai- Необработанный отказ от обещания - PullRequest
1 голос
/ 05 апреля 2019

Я сделал очень простой RESTful API, который позволяет пользователям добавлять, удалять и обновлять информацию о студентах Хогвартса. Монго действует как постоянный слой.

GET-запрос к url/students должен вернуть список всех объектов ученика. При написании теста я написал

expect(res).to.equal('student list');

Это только для начальной проверки, чтобы убедиться, что тест не пройден, но вместо этого я получаю эту ошибку:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected { Object (domain, _events, ...) } to equal 'student list'

Так что он знает, что эти два значения различны, но вместо того, чтобы тест не прошел, он выдает ошибку. Я вставил полный тестовый код ниже.

let chai = require('chai');
let chaiHttp = require('chai-http');
var MongoClient = require('mongodb').MongoClient;
chai.use(chaiHttp);
const expect = chai.expect;

describe('Students', async () => {
  describe('/GET students', () => {
    it('should GET all the students', async () => {
      chai.request('http://localhost:5000')
        .get('/students')
        .then(function (res) {
          try {
            expect(res).to.equal('hola');
          } catch (err) {
            throw err;
          }
        })
        .catch(err => {
          throw err; //this gets thrown
        })
    });
  });
});

И если вы можете показать мне синтаксис правильного использования async, ожидайте написания этих тестов, пожалуйста, сделайте это тоже.

1 Ответ

1 голос
/ 06 апреля 2019

Тест проходит и регистрирует предупреждение "Unhandled promise rejection", потому что ошибка генерируется в пределах Promise, что приводит к отклонению Promise.

Поскольку Promise не возвращается или await -ed, тест успешно завершен ...

... и поскольку ничто не ожидает или не обрабатывает отклоненный Promise, Node.js регистрирует предупреждение.

Подробности

Ошибка, выданная в тесте, не сможет выполнить тест:

it('will fail', function () {
  throw new Error('the error');
});

... но отклоненный Promise не провалит тест, если он не будет возвращен илиawait -ed:

it('will pass with "Unhandled promise rejection."', function() {
  Promise.reject(new Error('the error'));
});

.catch возвращает Promise, поэтому добавление .catch возвращает отклоненное Promise, ноесли этот Promise не возвращен или await -едан, то тест также пройдет:

it('will also pass with "Unhandled promise rejection."', function() {
  Promise.reject(new Error('the error')).catch(err => { throw err });
});

... но если отклоненный Promise будет возвращен или await -едан, тотест не пройден:

it('will fail', async function() {
  await Promise.reject(new Error('the error'));
});

И если вы можете показать мне синтаксис правильного использования async, ожидайте написания этих тестов, пожалуйста, сделайте это тоже.

Для вашего теста вы cупростить это до:

const chai = require('chai');
const expect = chai.expect;
const chaiHttp = require('chai-http');
chai.use(chaiHttp);

describe('Students', async function() {
  describe('/GET students', function() {
    it('should GET all the students', async function() {
      const res = await chai.request('http://localhost:5000').get('/students');
      expect(res).to.equal('hola');  // <= this will fail as expected
    });
  });
});

Подробности

Из chai-http документ :

Если доступно Promise, request() становится библиотекой с поддержкой Promise

... поэтому chai.request(...).get(...) возвращает Promise.

Вы можете просто awaitPromise и тест будет ждать, пока Promise разрешится, прежде чем продолжить.

...