В этот ответ упоминается использование expectOutputString()
чтобы ожидать выходных строк в PHPUnit. Мне также нужно сделать своего рода аналог этого, который должен сказать макету для вывода строки. Я ранее использовал $mock->will($this->throwException(Exception('foo'))
чтобы мой макет генерировал исключение, но теперь вместо того, чтобы генерировать исключение, мне нужно, чтобы он регистрировал ошибку, а НЕ повторно выбрасывал исключение, а это значит, что мне нужно, чтобы мой макет выводил строку так же, как error_log()
делает в методе, который я пытаюсь смоделировать, так что мой тест может ожидать строку.
Имеет ли это смысл? Можно ли это сделать? PHPUnit предлагает способ сделать это?
С точки зрения тестируемости всегда лучше абстрагировать запись ошибок в класс. Если вы делаете прямые звонки error_log()
у вас будут трудности с проверкой сделанных звонков.
Если вы не можете рефакторинг ваш код и использовать класс для регистрации ошибок, вы можете попытаться установить специальный обработчик ошибок, который будет хранить сообщения в каком-то месте, а затем проверить эти сообщения во время теста после соответствующего вызова.
Но если ты можешь, лучше создать класс с методами, которые абстрагируют собственный лог ошибок php. Этот класс будет зависимостью тестируемого класса. Вы можете либо передать его в качестве обязательного аргумента конструктора, либо сделать так, чтобы класс создал его автоматически, но позволил установить его внешне. Очевидно, что в тесте вы вводите макет этого класса «ErrorLogger» с ожиданиями
Других решений пока нет …