Как протестировать promises с помощью Mocha

Я использую Mocha для проверки асинхронной функции, которая возвращает обещание.

Какой лучший способ проверить, что обещание разрешает правильное значение?

Ответ 1

Mocha имеет встроенную поддержку Promise начиная с версии 1.18.0 (март 2014 г.). Вы можете вернуть обещание из тестового примера, и Mocha будет ждать его:

it('does something asynchronous', function() { // note: no `done` argument
  return getSomePromise().then(function(value) {
    expect(value).to.equal('foo');
  });
});

Не забывайте ключевое слово return во второй строке. Если вы случайно опустили его, Mocha предположит, что ваш тест синхронный, и он не будет ждать функции .then, поэтому ваш тест всегда будет проходить, даже если утверждение не выполнено.


Если это становится слишком повторяющимся, вы можете использовать библиотеку chai-as-promised, которая дает вам свойство eventually для тестирования promises проще:

it('does something asynchronous', function() {
  return expect(getSomePromise()).to.eventually.equal('foo');
});

it('fails asynchronously', function() {
  return expect(getAnotherPromise()).to.be.rejectedWith(Error, /some message/);
});

Снова не забывайте ключевое слово return!

Ответ 2

Затем "возвращает" обещание, которое можно использовать для обработки ошибки. Большинство библиотек поддерживают метод под названием done, который гарантирует, что будут удалены любые неработающие ошибки.

it('does something asynchronous', function (done) {
  getSomePromise()
    .then(function (value) {
      value.should.equal('foo')
    })
    .done(() => done(), done);
});

Вы также можете использовать что-то вроде mocha-as-promised (есть похожие библиотеки для других тестовых фреймворков). Если вы используете серверную часть:

npm install mocha-as-promised

Затем в начале вашего script:

require("mocha-as-promised")();

Если вы используете клиентскую сторону:

<script src="mocha-as-promised.js"></script>

Затем внутри ваших тестов вы можете просто вернуть обещание:

it('does something asynchronous', function () {
  return getSomePromise()
    .then(function (value) {
      value.should.equal('foo')
    });
});

Или в кофе script (согласно вашему оригинальному примеру)

it 'does something asynchronous', () ->
  getSomePromise().then (value) =>
    value.should.equal 'foo'