Здесь я пишу небольшое приложение с единственной целью - улучшить привычки ООП / тестируемого кода. И любить это, кстати!
Я стремлюсь усвоить методологию разработки «тестируемого кода», в основном, читая сообщения евангелистов модульного тестирования, таких как Себастьян Бергманн, Миско Хевери и Джорджио Сирони.
Среди трудностей, которые я усвоил, - неправильное использование статических методов, объектов, которые зависят от объектов, которые зависят от объектов. В настоящее время я застрял на глобальных константах. В начале своего приложения я загружаю одну КОНСТАНТУ, которая просто устанавливает режим приложения в отладке или продукте:
/**
* APP_MODE values:
*
* PROD Production, no errors displayed email sent on error, logs to
* logs/app-<date-time>.log.
*
* DEBUG: All warnings and errors displayed, emails disabled and log messages
* sent to console. Whether in-memory modifications to configuration
* data are allowed
*/
define("APPMODE", "DEBUG");
Как можно протестировать классы приложения для правильной обработки ошибок в зависимости от состояния этой константы?
Сначала я подумал просто переместить глобальную константу в константу класса, а не в моем классе init, и это решает случай для этого конкретного класса, но меня не устраивает эта процедура. Я имею в виду, следует ли просто избегать общесайтовых констант, которые не являются "истинными" константы в строгом смысле одного возможного значения всегда ?
Я не могу представить, чтобы тестировщикам приходилось писать по 2 набора тестов для каждого класса, т.е. initClassDebugTest.php и initClassProdTest.php, если phpUnit не может каким-то образом сбросить глобальное состояние? Следует ли избегать использования глобальных констант таким образом? У меня странное чувство, что мне вообще не следует использовать здесь константу. Мне было бы очень любопытно узнать, как проверенные кодировщики будут обрабатывать глобальные определения с двумя возможными значениями во время выполнения.