2016-07-12 3 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 (вторая половина дня), переход в середине обработки может быстро привести к несогласованному результату; часто лучше всего фиксировать время начала и основывать каждое функциональное решение на этом снимке. –

Смежные вопросы