Я использую Mocha для проверки асинхронной функции, которая возвращает обещание.
Какой лучший способ проверить, что обещание разрешает правильное значение?
Я использую Mocha для проверки асинхронной функции, которая возвращает обещание.
Какой лучший способ проверить, что обещание разрешает правильное значение?
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
!
Затем "возвращает" обещание, которое можно использовать для обработки ошибки. Большинство библиотек поддерживают метод под названием 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'