2013-06-24 4 views
4

Я очень новичок в тестировании PHPUnit, и мне нужна помощь, если это возможно.PHPUnit | Тестирование json return

У меня есть плагин в WordPress для модульного тестирования, основанный на PHPUnit Framework. В настоящее время я создаю плагин WordPress с использованием вызовов AJAX, чтобы взаимодействовать с данными WordPress.

В моем плагине, я создать класс, который создает некоторые add_action ('wp_ajax_actionname', массив (__ class__, 'FunctionName'))

FunctionName выглядит следующим образом:

function functionName() 
{ 

global $wpdb; 

if(wp_verify_nonce($_POST['s'], 'cdoCountryAjax') != false) 
{ 
    $zones = $wpdb->get_results(
     $wpdb->prepare(
      " 
       SELECT 
        zone_id AS ID, 
        name AS Name 
       FROM 
        " . $wpdb->prefix . "cdo_zone 
       WHERE 
        country_id = %d 
      ", 
      $_POST['id'] 
     ) 
    ); 

    header('Cache-Control: no-cache, must-revalidate'); 
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
    header('Content-type: application/json'); 

    $results = array(); 

    foreach($zones as $zone) 
    { 
     $results[$zone->ID] = $zone->Name; 
    } 

    echo json_encode($results); 
} 

die(-1); 

} 

выше функция получает результаты запроса, возвращенные в Object, и я эхом отзывался с помощью функции json_encode.

Вопрос в том, как я могу проверить вышеуказанный метод? Есть ли способ проверить это?

+2

Вы можете использовать 'wp_die()' вместо 'умереть()'. Его можно отключить для тестирования. См. Http://core.trac.wordpress.org/changeset/12790 и http://core.trac.wordpress.org/ticket/11892 – hakre

+0

Спасибо, hakre за вашу идею !! :) –

ответ

5

Есть два не очень-тест чистых вещей, которые вы будете иметь дело с:

Генерирование выхода с эхом. Для этого вы можете связать вызов функции внутри пары ob_start() ... ob_end_clean(), чтобы получить вывод, который был бы эхом.
Редактировать:
Как оказалось, в библиотеке уже есть встроенная поддержка, проверьте Testing Output section of the manual.

Другой проблемой, с которой вам приходится иметь дело, является die(-1) в конце. Вы можете использовать функцию set_exit_overload(), указанную в php test helpers, чтобы отключить ее, поэтому ваш тестовый процесс не будет умирать вместе с кодом. Это немного сложнее настроить (вам понадобится компилятор C). Если это не сработает для вас, вам может быть не повезло, если вы не можете изменить код на что-то более дружественное к тестированию. (Я не слишком хорошо знаком с wordpress, но для плагинов ajax это die() кажется recommended). В крайнем случае вы можете попробовать запустить сценарий в качестве подпроцесса с popen() или exec() и получить результат таким образом (вам нужно будет написать файл, который включает в себя источник, и вызывает функцию, которая не будет проверена).

В идеальном случае это будет выглядеть примерно так:

function test_some_wp_plugin_test() { 
    // deal with the die() 
    set_exit_overload(function() { return false; }); 

    // set expectation on the output 
    $expected_result = array('foo' => 'bar'); 
    $this->expectOutputString(json_encode($expected_result)); 

    // run function under the testing 
    function_in_test(); 
} 

В худшем случае, может быть что-то вроде:

function test_some_wp_plugin_test() { 
    $output = array(); 
    // you will need cli php installed for this, on windows this would be php.exe at the front 
    $results = exec('php tested_function_runner.php', $output); 
    // start asserting here 
} 

И внутри tested_function_runner.php:

include 'path/to/the/plugin.php'; 
function_under_test(); 

Конечно, вы можете сделать этот сценарий бегуна более общим с параметрами, переданными и используемыми с .

5

Когда вы чувствуете, что это так, пожалуйста, также взгляните на функции тестирования вывода PHPUnit, они великолепны.

(Как сказал complex857, в этой проблеме есть много бит и частей, но для тестовых тестов, опираясь на эту встроенную функцию PHPUnit.)

Пособие красноречив и полезно: https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.output