2015-07-31 4 views
3

Книга ржавчины says, что использование модуля «тесты» является идиоматическим способом проведения модульных испытаний. Но я не вижу функцию из супермодуля в модуле тестов, если эта функция не отмечена «pub». Как следует проверять внутренние функции?Что такое идиоматический способ проверки частной функции?

Мой первый инстинкт должен был искать способ #ifdef ключевое слово pub. Я сделал это в прошлом для тестирования на C++. Для Rust я сделал просто тесты для частных функций в модуле, а затем тесты для открытого интерфейса в модуле «тесты».

Я делаю это правильно?

ответ

5

Nest ваш тестовый модуль внутри модуля, содержащего частные методы или структур:

mod inners { 
    fn my_func() -> u8 { 42 } 

    mod test { 
     #[test] 
     fn is_answer() { 
      assert_eq!(42, super::my_func()); 
     } 
    } 
} 

Конечно, я не согласен, что вы должны проверить личные вещи в целом, но то другое обсуждение.

+2

Я сделал это сначала, но я делал 'use super :: *'. Если я просто явно использую super :: some_function', он работает, как вы описываете. Благодарю. –

+0

@SeanPerry AFAIK glob import не включает функции, только типы. Один из немногих раз, когда я использую импорт glob, - это когда я пишу свой тестовый модуль, поскольку обычно я хочу проверить все в родительском модуле. – Shepmaster

3

Идиоматический способ проверки частной функции - это не делать. Модульные тесты должны тестировать общественное поведение класса. Частные методы - это просто детали реализации вышеупомянутых общедоступных методов, которые вы должны проверить.

+3

У меня есть простые внутренние элементы, которые не записываются и не печатаются или что-то еще. Общедоступные процедуры, которые их называют. Поэтому мои модульные тесты являются тихими, идемпотентными и т. Д. Это не проверка внешнего доступа, который часто похож на частные области кода. –

+1

@SeanPerry Я бы не согласился с тем, что часто тестируется внешний доступ. Действительно, чистая логика, открытая как публичные функции или методы, позволяет потребителям, расположенным ниже по потоку, еще лучше. Вы можете проверить, что открытый интерфейс и пользователи вашей библиотеки имеют дело с битами ввода-вывода. – Shepmaster

+0

Иногда вам нужно иметь доступ к деталям реализации, чтобы вызвать определенное поведение через открытый API. Простым примером может быть проверка метода сортировки массива: при малых количествах, т.е. около 10 элементов, используя bubblesort вместо quicksort (или аналогичных), как правило, быстрее. Порог - это частная информация о реализации, но вам нужно знать это, чтобы надежно запускать обе кодировки в вашем тесте. – kralyk

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