Почему 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 не могут успешно запустить файлы веб-сайтов.
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 не выполняются, это вызывает исключение, приводящее к сбою теста.