【问题标题】:Error handling when testing Solana event emitting测试 Solana 事件发出时的错误处理
【发布时间】:2022-12-14 06:01:09
【问题描述】:

我正在按照此处所述在我的 Solana 程序中编写事件发射测试:https://github.com/coral-xyz/anchor/blob/master/tests/events/tests/events.js

anchor.setProvider(anchor.AnchorProvider.env());
const program = anchor.workspace.Events;

it("Is initialized!", async () => {
  let listener = null;

  let [event, slot] = await new Promise((resolve, _reject) => {
    listener = program.addEventListener("MyEvent", (event, slot) => {
      resolve([event, slot]);
    });
    program.rpc.initialize();
  });

  await program.removeEventListener(listener);

  assert.isAbove(slot, 0);
  assert.strictEqual(event.label, "hello");
});

如果指令成功完成,效果很好。但是,如果在执行过程中发生任何错误,测试代码将永远静默等待事件发出,而这本应不会发生。

谁能建议一种处理此类异常的方法,以免它们被“吞噬”并扔到上层?

【问题讨论】:

    标签: javascript solana solana-web3js anchor-solana


    【解决方案1】:

    如果我对问题的理解正确,您需要在等待事件时添加某种超时,对吗?在这种情况下,你应该能够使用 setTimeout 来检查你的监听器的结果和错误,如果它没有被触发,即:

    it("Is initialized!", async () => {
      let listener = null;
      let event = {label: ""};
      let slot = 0;
      setTimeout(function(){
        assert.isAbove(slot, 0);
        assert.strictEqual(event.label, "hello");
      },5000);
      [event, slot] = await new Promise((resolve, _reject) => {
        listener = program.addEventListener("MyEvent", (event, slot) => {
          resolve([event, slot]);
        });
        program.rpc.initialize();
      });
    
      await program.removeEventListener(listener);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2021-11-18
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多