我在 rinkeby 上使用带有以太的安全帽来测试一个智能合约,该合约向本地链链接节点发出 aa get 请求。我可以在节点仪表板上观察到请求已完成。
我正在努力编写一个等待第二次履行交易得到确认的测试。
我在SmartContractKit/chainlink repo 测试中看到了类似的测试
it("logs the data given to it by the oracle", async () => {
const tx = await oc.connect(roles.oracleNode).fulfillOracleRequest(...convertFufillParams(request, response));
const receipt = await tx.wait();
assert.equal(2, receipt?.logs?.length);
const log = receipt?.logs?.[1];
assert.equal(log?.topics[2], response);
});
我看不到这会等待完成的交易。在consumer.sol 这个函数调用中有一个事件RequestFulfilled,即emit,但是这个测试似乎没有在监听它。
我发现的另一个示例,ocean protocol request test,通过在测试轮询中创建请求 ID、访问器和 while 循环的映射来完成此操作,直到找到请求 ID。
it("create a request and send to Chainlink", async () => {
let tx = await ocean.createRequest(jobId, url, path, times);
request = h.decodeRunRequest(tx.receipt.rawLogs[3]);
console.log("request has been sent. request id :=" + request.id)
let data = 0
let timer = 0
while(data == 0){
data = await ocean.getRequestResult(request.id)
if(data != 0) {
console.log("Request is fulfilled. data := " + data)
}
wait(1000)
timer = timer + 1
console.log("waiting for " + timer + " second")
}
});
这是有道理的,我明白它是如何工作的。但是,当我想必须有一种更优化的方式时,我想避免创建映射和访问器。