如何冻结测试时间?

时间:2016-07-12 08:29:52

标签: unit-testing rust

我正在使用void Start(){ StartCoroutine(checkInternetConnection((isConnected)=>{ // handle connection status here })); } crate,我想测试与时间相关的函数输出。

我想按时间time计算时间;我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

我假设你的意思是你有这样的功能:

pub fn is_now_afternoon() -> bool {
    let t = time::now();
    t.tm_hour >= 12
}

你想测试它是否适用于特定时间。

我会以稍微不同的方式构建它并将时间花在:

// More generic helper function, which does all the real work
fn is_t_afternoon(t: &Tm) -> bool {
    t.tm_hour >= 12
}

// Simple wrapper to use now.
pub fn is_now_afternoon() -> bool {
    is_t_afternoon(&time::now())
}

#[test]
fn test_afternoon() {
    assert!(is_t_afternoon(Tm{ tm_hour: 13, /* other fields */ }));
    assert!(!is_t_afternoon(Tm{ tm_hour: 10, /* other fields */ }));
}

这个想法是你将完成所有工作的代码分离成单独的,更容易测试的函数,这些函数不依赖于“真实世界”环境。作为奖励,我经常会发现那些更通用的函数在以后的其他环境中有用。

另一种策略(我认为更难,更容易出错)是独立计算给出测试函数中当前时间的答案,并检查真实的一致。然而,这似乎可能导致间歇性测试,或者只是在测试中遇到与“真实”功能相同的错误。