получение полезной нагрузки от события подложки обратно в тестах на ржавчину - PullRequest
0 голосов
/ 13 марта 2020

Я успешно создал свой первый субстратный проект, и встроенный поддон также работает нормально. Теперь я хотел создать тесты для потока и предоставленных функций.

Мой поток заключается в создании случайного ха sh и сохранении этого ха sh, связанного с отправителем транзакции

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(())

работает хорошо до сих пор, когда теперь я хочу проверить поток с помощью письменного теста, я хочу проверить, назначен ли га sh, испускаемый в событии Created, также на карте HashOwner. Для этого мне нужно вернуть значение из события обратно.

И это моя проблема: D Я не профессионал в ржавчине, и все примеры, которые я нашел, ожидают, что все значения, полученные в событии, будут такими:

// 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 доступные значения:

окно отладки vs кода

но я не знаю, как вернуть это Ха sh в переменную обратно ... возможно, это только один вкладыш ... но мои знания о ржавчине чертовски малы: D

спасибо за помощь

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Вот несколько обобщенный c пример того, как анализировать и проверять события, если вы заботитесь только о последнем событии, которое ваш модуль поместил в систему, и ничего больше.

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),
);

Действительно, вы также можете опустите первую карту или сделайте ее более компактными способами, но я сделал это так, чтобы вы могли видеть ее шаг за шагом.

Распечатайте System::events(), это также помогает.

0 голосов
/ 13 марта 2020

Я теперь получил это от ответа kianenigma:)

Я хотел повторно использовать данные в событии:

    let lastEvent = 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 TestEvent::pid(inner) = e {
            Some(inner)
        } else {
            None
        }
    })
    .last()
    .unwrap();
    if let RawEvent::Created(newHash, initiatedAccount) = lastEvent {
        // there are the values :D
    }

это может быть написано лучше, но это помогает мне :)

...