2016-07-12 7 views

答えて

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 */ })); 
} 

アイデアは、あなたが依存していない別の、より簡単にテスト可能な関数にすべての作業を行うコードを分離することであること「現実の世界」環境私はしばしば、より一般的な関数が後で他の文脈で役に立つことを見出します。

もう一つの戦略(これはもっと難しく、エラーが起こりやすいと思います)は、テスト機能で現在の時間に答えが与えられているかどうかを独立して計算し、実際のものが一致するかどうかをチェックすることです。しかし、これは断続的なテストにつながる可能性があります。あるいは、実際の機能と同じバグをテストに持ち込んでいるようです。

+0

これらの仮定はどのようにして作成しましたか? – erip

+0

私はちょうどそれが私が尋ねられていると思っていることを意味しました。 –

+2

さらに、 'now()'が何回であるのかを尋ねると、すぐに災害につながる可能性があります。 11:59:59(午後なし)から始まり12:00:01(午後)に終了する処理を想像してみてください。処理の途中で遷移するとすぐに出力が矛盾することがあります。開始時間を把握し、このスナップショットのすべての機能的決定を下すことが最良の場合があります。 –

関連する問題