Превышен тайм-аут для обещаний 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]);