0

我有一个异步函数,它等待一个承诺,当它收到一些“数据”时它会解决。但是,当我运行测试时,我得到一个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)
    });
  }

});

承诺不是解决了吗?我可以在回调中看到“数据”返回,因为我正在测试的solidity 代码中发出回调事件。

4

2 回答 2

0

在我看来,这里有一些问题。

首先,你的函数没有返回任何东西,即它应该是return Promise.all([first, second]);.

其次,如果 promise.all 的目标是并行执行 Promise,那么这不是它在这里所做的,因为您已经await在上面的这些函数调用上有了语句。您在这里寻找的是:

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

现在就未解决的承诺而言,我假设事件是从oracle.LogResult(). 在这种情况下,您要做的是设置您的承诺以首先侦听事件,例如:

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

现在你有 2 个正在监听事件的 Promise。接下来,您生成事件:

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

最后,确保等待承诺的结果:

return await Promise.all([first, second]);
于 2020-12-14T17:36:42.017 回答
0

我设法解决了这个问题,因此将其发布在这里,以便其他人可以使用该方法。

我创建了一个 Promise,它在我们可以设置的持续时间后超时:

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

然后,我将 timeoutPromise 与正在获取数据的 Promise 竞争,就像我发布的案例一样:

Promise.race([getFirstEvent(oracle.LogResult({fromBlock:'latest'})), timeoutPromise]);
于 2020-12-14T13:14:09.220 回答