Как правильно провалить асинхронный модульный тест в jasmine-node

Почему следующий код не работает с тайм-аутом? Похоже, что «должен» выдает ошибку, а done() никогда не вызывается? Как мне написать этот тест, чтобы он не прошел правильно, вместо того, чтобы жасмин сообщал о тайм-ауте?

var Promise = require('bluebird');
var should = require('chai').should();
describe('test', function () {
  it('should work', function (done) {
    Promise.resolve(3)
      .then(function (num) {
        num.should.equal(4);
        done();
      });
  });
});

вывод консоли:

c:>спецификация узла jasmine\

Необработанное отклонение AssertionError: ожидается, что 3 будет равно 4 ... Ошибки: 1) тест должен работать Сообщение: тайм-аут: истекло через 5000 мс, ожидание завершения спецификации


person user3409889    schedule 13.04.2015    source источник


Ответы (2)


Если вы хотите использовать Promises в своем пакете Mocha, вы должны использовать return вместо обратного вызова done(), например:

describe('test', function () {
  it('should work', function () {
    return Promise.resolve(3)
      .then(function (num) {
        num.should.equal(4);
      });
  });
});

Еще более четкий способ написать это с помощью модуля chai-as-promised:

describe('test', function () {
  it('should work', function () {
    return Promise.resolve(3).should.eventually.equal(4);
  });
});

Просто убедитесь, что он правильно запрошен, и скажите chai использовать его:

var Promise = require('bluebird');
var chai = require('chai');
var should = chai.should();
var chaiAsPromised = require('chai-as-promised');

chai.use(chaiAsPromised);
person Rodrigo Medeiros    schedule 13.04.2015
comment
Спасибо за совет использовать chai-as-promise. Используя jasmine-node, мне пришлось сделать return Promise.resolve(3).should.eventually.equal(4).and.notify(done); - person user3409889; 13.04.2015
comment
Ой, извините, только сейчас я увидел, что вы говорите о jasmine, а не о mocha. Но да, chai-as-promised тоже поддерживает jasmine. И еще: я совершенно уверен, что последние версии jasmine уже поддерживают узел по умолчанию, поэтому вам не нужен jasmine-node, если вы не хотите переходить на более новую версию. - person Rodrigo Medeiros; 13.04.2015

Использование .then() и только done()

it('should work', (done) => {
  Promise.resolve(3).then((num) => {
    // your assertions here
  }).catch((err) => {
    expect(err).toBeFalsy();
  }).then(done);
});

Использование .then() и done.fail()

it('should work', (done) => {
  Promise.resolve(3).then((num) => {
    // your assertions here
  }).then(done).catch(done.fail);
});

Использование сопрограмм Bluebird

it('should work', (done) => {
  Promise.coroutine(function *g() {
    let num = yield Promise.resolve(3);
    // your assertions here
  })().then(done).catch(done.fail);
});

Использование async/await

it('should work', async (done) => {
  try {
    let num = await Promise.resolve(3);
    // your assertions here
    done();
  } catch (err) {
    done.fail(err);
  }
});

Использование async/await с .catch()

it('should work', (done) => {
  (async () => {
    let num = await Promise.resolve(3);
    // your assertions here
    done();
  })().catch(done.fail);
});

Другие варианты

Вы специально спрашивали о jasmine-node, так что это то, о чем приведенные выше примеры, но есть и другие модули, которые позволяют вам напрямую возвращать промисы из тестов вместо вызова done() и done.fail() - см.:

person rsp    schedule 12.04.2017