rust - 在使用rust 测试中从底物事件中获取有效负载

标签 rust substrate

我已经成功创建了我的第一个基板项目,并且构建的托盘也可以正常工作。现在我想为流程和提供的功能创建测试。

我的流程是生成一个随机散列并将这个散列存储到交易的发送者

let _sender = ensure_signed(origin)?;
let nonce = Nonce::get();
let _random_seed = <randomness_collective_flip::Module<T>>::random_seed();
let random_hash = (_random_seed, &_sender, nonce).using_encoded(T::Hashing::hash);


ensure!(!<Hashes<T>>::contains_key(random_hash), "This new id already exists");

let _now = <timestamp::Module<T>>::get();

let new_elem = HashElement {
    id: random_hash,
    parent: parent,
    updated: _now,
    created: _now
};

<Hashes<T>>::insert(random_hash, new_pid);
<HashOwner<T>>::insert(random_hash, &_sender);

Self::deposit_event(RawEvent::Created(random_hash, _sender));

Ok(())

到目前为止效果很好,当我现在想用书面测试测试流程时,我想检查 Created 事件中发出的哈希是否也在 HashOwner Map 中分配。为此,我需要从事件中获取值(value)。

这是我的问题:D 我不是 rust 专业人士,我发现的所有示例都期望在这样的事件中发出所有值:
// construct event that should be emitted in the method call directly above
let expected_event = TestEvent::generic_event(RawEvent::EmitInput(1, 32));

// iterate through array of `EventRecord`s
assert!(System::events().iter().any(|a| a.event == expected_event));

在调试我的书面测试时:
assert_ok!(TemplateModule::create_hash(Origin::signed(1), None));
let events = System::events();

let lastEvent = events.last().unwrap();
let newHash = &lastEvent.event;

我在 VSCode 中看到这些值可用:

debug window of vs code

但我不知道如何在变量中获取这个哈希......也许这只是一个衬里......但我的使用rust 知识太少了:D

感谢您的帮助

最佳答案

这是一个关于如何解析和检查事件的通用示例,如果您只关心模块放入系统的最后一个事件而不关心其他任何事情。

assert_eq!(
    System::events()
        // this gives you an EventRecord { event: ..., ...}
        .into_iter() 
        // map into the inner `event`.
        .map(|r| r.event)
        // the inner event is like `OuterEvent::mdouleEvent(EventEnum)`. The name of the outer 
        // event comes from whatever you have placed in your `delc_event! {}` in test mocks.
        .filter_map(|e| { 
            if let MetaEvent::templateModule(inner) = e {
                Some(inner)
            } else {
                None
            }
        })
        .last()
        .unwrap(),

    // RawEvent is defined and imported in the template.rs file. 
    // val1 and val2 are things that you want to assert against.
    RawEvent::Created(val1, val2),
);

实际上,您也可以省略第一张 map 或以更紧凑的方式进行操作,但我已经这样做了,因此您可以逐步看到它。

打印 System::events() ,这也有帮助。

关于rust - 在使用rust 测试中从底物事件中获取有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60666012/

相关文章:

rust - 实现所有权的可选消费的最佳实践是什么?

types - 具有泛型类型的多个特征的类型别名

rust - 如何从底物中的子树中获取根哈希或证明?

substrate - 宏 #[pallet::genesis_config] 和 #[pallet::genesis_build] 在 sudo pallet 上做什么?

substrate - 在账户和托盘之间转移 Assets

substrate - 如何在 Substrate 运行时开发中打印出跟踪消息

rust - 为什么带有子模块和名称冲突的函数的模块可以工作?

winapi - CertOpenSystemsStoreW 或 CertCloseStore 的 Rust FFI 声明有什么问题?

performance - 为什么XOR比OR快得多?

substrate - 在 Substrate 中,代码 : 1012 "Transaction is temporarily banned" mean? 是什么