2015-04-22 5 views
2

Первая функция, которую вы видите in this wp source code, - это то, что я хочу отключить, в соответствии с документами phpunit, я бы заглушил класс, а затем метод и то, что этот метод вернется. Тогда я мог бы назвать класс и ожидать, что метод будет вызываться один раз.stub a single function - не участвует в классе - php

Как всегда в следующей функции - что у меня есть в классе:

public function checked($value, $option, $key) { 
    $options = get_option($option); 

    if (isset($options[$key]) && $options[$key] == $value) { 
     return $this->checked = 'checked'; 
    } 
} 

вы можете видеть, что я называю get_option() Мне нужно окурок эту функцию, чтобы вернуть конкретный массив обратно, как я могу это сделать в PHP?

ответ

2

Вы не можете заглушить функции.

Причина, по которой он работает с классами, заключается в том, что 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.

0

Функции заглушки можно использовать с помощью runkit.

Взгляните на runkit_function_redefine, он позволяет временно заменить функцию другой, содержащей пользовательскую логику.

0

Действительно, WordPress использует функции много, и их трудно заглушить чистым способом.

Однако то, что вы можете сделать, это обернуть функцию в способе, как это:

public function get_option($option) { 
    return get_option($option); 
} 

public function checked($value, $option, $key) { 
    $options = $this->get_option($option); 

    if (isset($options[$key]) && $options[$key] == $value) { 
     return $this->checked = 'checked'; 
    } 
} 

Теперь вы можете легко издеваться метод get_option!