0

我正在尝试加快时间为自定义运行时模块做一些测试。我已经查看了该线程的答案并按照使用 Timestamp 的答案进行操作,但是,我无法访问 set_timestamp 方法。

设置:

#[cfg(test)]
mod tests {
    use super::*;
    use support::dispatch::Vec;
    use runtime_primitives::traits::{Hash};
    use runtime_io::with_externalities;
    use primitives::{H256, Blake2Hasher};
    use timestamp;
    use support::{impl_outer_origin, assert_ok, assert_noop};
    use runtime_primitives::{
        BuildStorage,
        traits::{BlakeTwo256, IdentityLookup},
        testing::{Digest, DigestItem, Header}
    };

    impl_outer_origin! {
        pub enum Origin for Test {}
    }

    #[derive(Clone, Eq, PartialEq)]
    pub struct Test;
    impl system::Trait for Test {
        type Origin = Origin;
        type Index = u64;
        type BlockNumber = u64;
        type Hash = H256;
        type Hashing = BlakeTwo256;
        type Digest = Digest;
        type AccountId = u64;
        type Lookup = IdentityLookup<Self::AccountId>;
        type Header = Header;
        type Event = ();
        type Log = DigestItem;
    }
    impl super::Trait for Test {
        type Event = ();
    }
    impl timestamp::Trait for Test {
        type Moment = u64;
        type OnTimestampSet = ();
    }

    type Pizza = Module<Test>;

错误如下:

error[E0599]: no function or associated item named `set_timestamp` found for type 
`srml_timestamp::Module<tests::Test>` in the current scope


    |
254 |  let now = <timestamp::Module<tests::Test>>::set_timestamp(9);
    |                                              ^^^^^^^^^^^^^ function or associated item 
                                            not found in `srml_timestamp::Module<tests::Test>`
4

2 回答 2

0

在 Substrate v1.0 中,该set_timestamp函数有一个#[cfg(feature = "std")]属性:

https://github.com/paritytech/substrate/blob/v1.0/srml/timestamp/src/lib.rs#L276

这意味着它只有在您使用std. 当您编写测试时,这应该可以工作,但我认为出现此问题是因为您试图从运行时环境中调用它,这很可能是no_std.

如果由于某种原因您确实需要在运行时中修改时间戳,您应该可以直接这样做:

https://github.com/paritytech/substrate/blob/v1.0/srml/timestamp/src/lib.rs#L249

<timestamp::Module<T>>::Now::put(new_time)

(我没有对此进行测试,但类似的东西应该可以工作)。

让我知道这是否有帮助。

于 2020-02-01T11:13:50.757 回答
-1

在 Substrate v1.0 中,您可以声明

type Moment = timestamp::Module<Test>;

然后使用它来设置特定的时间戳。

Moment::set_timestamp(9);

如果要获取时间戳值,可以执行以下操作:

let now_timestamp = Moment::now();
于 2020-02-01T13:20:52.013 回答