Вы не можете заглушить функции.
Причина, по которой он работает с классами, заключается в том, что PHPUnit создает исходный код PHP на лету, объявляя класс mock, который расширяет оригинал, перезаписывая функцию, подлежащую обрезанию. И он не может работать с функциями, объявленными как final.
Однако есть одна ситуация, которая позволяет выполнять даже функции заглушки: Использование пространств имен.
Вызов функции сначала попытается вызвать функцию этого имени в текущем пространстве имен. Если их нет, используется глобальное пространство имен. Таким образом, даже внутри пространства имен вы можете напрямую вызывать функции PHP, такие как strpos()
, не беспокоясь о префиксах всех их обратным слэшем.
Теперь посмотрим это в качестве примера:
namespace Stub;
function strpos($foo, $bar) {
return "The return value is stubbed";
}
# This will not call the PHP function
echo strpos("string", "i");
Так что, если вы поместите тест в пространство имен, и определить функцию в том же пространстве имен, вызов этой функции будет перехвачена.
Теперь единственное досаду заключается в том, что код в классе, который вы хотите протестировать, должен находиться в одном и том же пространстве имен (или наоборот - функция проверки и заглушки должна находиться в пространстве имен класса, который вы хотите test) - если это не так, вы не можете добавить функцию в это пространство имен. Кроме того, вы можете добавить функцию ONCE - вы должны иметь представление о том, как заставить функцию вести себя как макет, возможно, имея глобальную переменную, содержащую сконфигурированный макет, который используется для проверки вызовов и предоставления возвращаемых значений.
Однако, все это рано или поздно станет беспорядочным. Глобальные функции на самом деле не могут быть издевательствами/чистыми в PHP.