Как я могу имитировать вывод сообщений в журнал ошибок с помощью PHPUnit?

В этом ответе упоминается использование expectOutputString(), чтобы ожидать выходные строки в PHPUnit. Мне также нужно сделать своего рода аналог этого, а именно сказать макету вывести строку. Раньше я использовал $mock->will($this->throwException(Exception('foo')), чтобы мой макет выдавал исключение, но теперь вместо того, чтобы выдавать исключение, мне нужно, чтобы он регистрировал ошибку, а НЕ повторно выдавал исключение, что означает, что мне нужен мой макет для вывода строки так же, как error_log() в метод, который я пытаюсь смоделировать, чтобы мой тест мог ожидать строку.

Имеет ли это смысл? Возможно ли это сделать? Предлагает ли PHPUnit способ сделать это?


person beth    schedule 07.01.2015    source источник
comment
php_error()? Вы имеете в виду error_log()?   -  person gontrollez    schedule 08.01.2015
comment
Да. Это был долгий день.   -  person beth    schedule 08.01.2015


Ответы (1)


С точки зрения тестируемости всегда лучше абстрагировать регистрацию ошибок в классе. Если вы будете звонить напрямую error_log(), у вас возникнут трудности с проверкой сделанных звонков.

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

Но если вы можете, лучше создать класс с методами, которые абстрагируют встроенную регистрацию ошибок php. Этот класс будет зависимостью тестируемого класса. Вы можете либо передать его как обязательный аргумент конструктора, либо позволить классу создать его автоматически, но позволить установить его извне. Очевидно, что в тесте вы должны ввести макет этого класса «ErrorLogger» с ожиданиями.

person gontrollez    schedule 08.01.2015