Могу ли я сделать так, чтобы ожидания Чая происходили синхронно?

У меня есть фрагмент кода, который я тестирую в Chai и Pact. Это выглядит примерно так:

      var myVerify = () => {
        provider.verify().then(() => {
          console.log('B verified')
          done()
        })
      }
      expect(myVerify).to.not.throw()

Это работает, но для создания функции-обертки нужно проделать дополнительную работу, чтобы я дождался подтверждения выполнения Pact перед тем, как продолжить тестирование. Пакт имеет некоторое внутреннее состояние, которое прояснится, когда он будет сделан. Если я просто позвоню это:

ожидать (provider.verify()).to.not.throw()

тогда это будет конфликтовать с другими тестами.

Этот код, кажется, работает хорошо для меня, но он очень грязный. Есть ли более простой способ сделать это?

1 ответ

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

Есть 2 способа сделать то, что вы хотите:

1) Просто с мокко

return provider.verify().then(() => {
      console.log('B verified');
      done();
}, () => throw new Error("B verification failed"));

В этом простом примере мы не используем chai для проверки чего-либо, поскольку вы на самом деле не проверяете вывод данных проверки, вы просто проверяете, было ли обещание выполнено успешно, если нет, выдает ошибку, которая приведет к сбою. тесты. По умолчанию Mocha понимает обещания, если они возвращаются как часть теста.

Тем не менее, этот метод означает, что упаковка it функция должна вводить done параметр, которым я не фанат. Я фанат того, что использую:

2) Чай с Чай как обещано:

Вам нужно настроить чай, как и обещал, используя

chai.use(require("chai-as-promised))

затем в ваших тестах просто выполните:

return expect(provider.verify()).to.eventually.be.fulfilled;

Этот тест будет ожидать возвращения обещания, и Чай подтвердит, что оно действительно выполнено, а не отклонено. Я считаю, что этот синтаксис намного проще в использовании и упрощает написание тестов. Вы также можете иметь несколько ожиданий с одним и тем же обещанием, используя Promises.all:

var verify = provider.verify();
return Promises.all(
    expect(verify).to.eventually.be.fulfilled,
    expect(verify).to.eventually.be.true,
);
Другие вопросы по тегам