Почему PHPUnit не может удалить Мой Сайт Wordpress


Я изучал этот вопрос в течение нескольких дней, и хотя многие люди задают этот вопрос, я так и не нашел четкого и краткого ответа.

Я бегу:

  • Модуль PHP: Версия 3.7.21
  • WordPress: Версия 3.5.1
  • ОС: Ubuntu 11.10
  • MySQL: Версия 5.1.69-0ubuntu0.11.10.1
  • PHP: Версия 5.3.6-13ubuntu3.10

Короче говоря, у меня есть базовое ядро WordPress, загруженное в каталог на моем компьютере. У меня есть успешно загружены и установлены pear и phpunit. Я протестировал phpunit, написав базовые тесты на простых php-файлах, которые отлично работали. Моя проблема заключается в том, что я запускаю phpunit на сайте wordpress (на котором я не изменил основные файлы WP).

Я получаю ошибку:

"Неустранимая ошибка PHP: Вызов функции-члена main() на не являющемся членом объект в /<корневой каталог>/functions.php на линии 779".

Эта ошибка соответствует этому сегменту кода:

function wp( $query_vars = '' ) {
    global $wp, $wp_query, $wp_the_query;
    $wp->main( $query_vars ); // Line 779

    if ( !isset($wp_the_query) )
        $wp_the_query = $wp_query;
}

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

Некоторые решения, которые я прочитал и попробовал , которые не сработали для меня:

  • Измените необходимый файл в своем"index.php "файл.
  • Разместите требование"load.php "над головой в твоем"index.php "файл.
  • Переустановите WordPress
  • Смените ремешок на ботинке и среды phpunit.

Я был веб-разработчиком в течение 5 лет, но я никогда раньше не использовал WordPress для одного из своих клиентов. Как только я смогу это настроить, написание модульных тестов будет легко; но я понятия не имею, что вызывает эту проблему. Мы будем очень признательны за любые ссылки на руководства/учебные пособия или четкие объяснения. Спасибо, что уделили мне время.

--РЕДАКТИРОВАТЬ-- Тестовый файл, который я запускаю, выглядит следующим образом:

<?php   
//include PHPUnit
require_once('PHPUnit/Autoload.php');
//include the code to be tested
require_once('../index.php');

// extend the PHPUnit class
class StackTest extends PHPUnit_Framework_TestCase {

    public function testOne(){
        $this->assertTrue(TRUE);
        $this->assertEquals(2,2);
        $this->assertTrue(1<3);
    }
}
?>

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

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

Author: Devon Bernard, 2013-06-14

1 answers

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

На официальном сайте есть тонны информации репозиторий в основном блоге make. В файле начальной загрузки вашего набора тестов вам необходимо настроить все параметры, которые необходимо переопределить. Обычно это будут активные плагины (чтобы вы могли протестировать свой плагин):

$GLOBALS['wp_tests_options'] = array(
  'active_plugins' => array( 'plugin-folder/plugin-file.php' ), // Relative to WP Plugin directory
);

После этого вам необходимо включить файл includes/bootstrap.php из набора основных тестов. Как только это будет сделано, ваши тесты должны выполняться "ожидаемо".

Однако, по моему опыту, такие тесты никогда не выполняются должным образом, поскольку база данных и весь код WordPress представляют безумное количество скрытых зависимостей и состояний для ваших тестов. Из-за этого я предпочитаю просто издеваться над api WordPress и запускать свои тесты без всех этих зависимостей и всего этого состояния.

Для этого я использую WP_MOCK. Это позволяет вам имитировать среду WordPress с мелкозернистым управлением. Например, если у вас есть функция, которой необходимо добавить фильтр в 'the_content', а затем вызвать the_content(), следующий код для WP_Mock позволяет это проверить:

WP_Mock::expectFilterAdded( 'the_content', 'some_callback_you_expect', 10, 2 );
WP_Mock::wpFunction( 'the_content', array(
  'times' => 1,
  'args'  => array(),
) );
your_function();

Если ожидания указанные в WP_Mock не выполняются, это вызывает исключение, приводящее к сбою теста.

 4
Author: John P Bloch, 2013-06-14 21:16:54