Превышен тайм-аут для обещаний Mocha

У меня есть асинхронная функция, которая ожидает обещания, которое разрешается, когда получает некоторые "данные". Однако, когда я запускаю тест, я получаю Error: Timeout of 300000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

Вот мой фрагмент кода, я использую его в трюфеле для проверки контрактов на надежность:

contract("Test", async (accounts) => {
  it("test description", async () => {
       
      let first = await getFirstEvent(oracle.LogResult({fromBlock:'latest'}));
      let second = await getFirstEvent(oracle.LogResult({fromBlock:'latest'}));
      Promise.all([first,second]);
      //some assertion code
      
  });
  
  const getFirstEvent = (_event) => {
    return new Promise((resolve, reject) => {
      _event.once('data', resolve).once('error', reject)
    });
  }

});

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

2 ответа

Мне удалось решить эту проблему, поэтому я разместил ее здесь, чтобы другие могли использовать этот подход.

Я создал обещание, время ожидания которого истекает по истечении времени, которое мы можем установить:

      const timeoutPromise = new Promise((_, reject) => {
  setTimeout(() => {a
    reject(new Error('Request timed out'));
  }, 200000);
})

Затем я гоню timeoutPromise с Promise, который извлекает данные, как в случае, который я опубликовал:

      Promise.race([getFirstEvent(oracle.LogResult({fromBlock:'latest'})), timeoutPromise]);

Мне кажется, что здесь что-то не так.

Прежде всего, ваша функция ничего не возвращает, т.е. она должна быть return Promise.all([first, second]);.

Во-вторых, если целью promise.all является параллельное выполнение обещаний, то здесь это не так, потому что у вас уже есть awaitоператоры для этих вызовов функций выше. То, что вы ищете здесь, будет:

      return await Promise.all([
  getFirstEvent(oracle.LogResult({fromBlock:'latest'}),
  getFirstEvent(oracle.LogResult({fromBlock:'latest'})]);

Теперь с точки зрения обещания, которое не разрешается, я предполагаю, что событие генерируется из oracle.LogResult(). В этом случае вам нужно сначала настроить обещания для прослушивания события, например:

      let first = getFirstEvent();
let second = getSecondEvent();

Теперь у вас есть 2 промиса, которые прослушивают события. Далее вы генерируете событие:

      oracle.LogResult({ fromBlock: 'latest' });
oracle.LogResult({ fromBlock: 'latest' });

Наконец, вы гарантируете, что ждете результат промисов:

      return await Promise.all([first, second]);
Другие вопросы по тегам