Simpletest: тестирование эхо-операторов?

Я только что тестировал некоторые PHP-файлы с помощью simpletest и обнаружил, что он не будет работать слишком хорошо с функциями, которые на самом деле выводят (эхо) что-либо.

Итак, есть ли что-нибудь, что я могу сделать для тестирования функций, которые повторяют вещи, без использования ob_buffer() в PHP?

Спасибо


person Industrial    schedule 17.11.2010    source источник
comment
‹?php эхо Hello World; ?› :-) зачем использовать функции для эха?   -  person zod    schedule 17.11.2010
comment
@zod, если это было так просто, то почему бы просто не сделать ?>Hello World<?php и вообще не использовать echo. Я предполагаю, что ОП должен собирать строки из различных источников или условно, и вы не хотите засорять этот код внутри своих шаблонов. Скорее вопрос должен заключаться в том, почему OP не возвращает строки и echo их там, где это необходимо. Это упростит тестирование функций (и решит проблемы).   -  person Gordon    schedule 17.11.2010
comment
Ни одна из тестовых сред на основе JUnit API (PHPUnit, SimpleTest, SnapTest) не может этого сделать (без обходных путей). Для тестирования функциональности необработанного PHP попробуйте .phpt скрипты.   -  person mario    schedule 17.11.2010


Ответы (2)


Если вы проверяете достоверность самого вывода, то нет. Не без выходного буфера. Однако вы МОЖЕТЕ проверить это с помощью JavaScript. Вы даже можете проверить это с помощью simpletest, передав вывод обратно через ajax в другой поток.

Круговой? О да, детка.

person DampeS8N    schedule 17.11.2010

Использование приведенного ниже совершенно глупого подхода должно дать вам то, что вы хотите. Эй... было весело писать :)

<?php
/**
 * The function which output you want to test.
 *
 * @param string $arg1
 * @param string $arg2
 */
function function_with_echo($arg1, $arg2) {
    $c = array();
    echo "X";
    foreach (range(0,2) as $i) {
        print $i * 2 . $arg2;
    }
    echo "Yir $arg1";
}

/**
 * Stupid, too big, ugly function that takes a function and creates a new
 * function with two underscores prefixed (__) where all echo and print
 * statements instead are collected into a temporary variable and returned. 
 * Does not work for functions that already returns something, although 
 * that could be fixed too!
 *
 * @param string $function_name
 */
function change_output_to_return($function_name) {
    $r = new ReflectionFunction($function_name);
    $lines = array_slice(
        file($r->getFileName()),
        $r->getStartLine() - 1,
        $r->getEndLine() - $r->getStartLine() + 1
    );
    $first = array_shift($lines);
    array_unshift($lines, $first, '$__temp = "";' . "\n");
    $last = array_pop($lines);
    array_push($lines, 'return $__temp;' . "\n", $last);
    $code = "<?php " . implode("", $lines);
    $echo_free_code = '';
    foreach(token_get_all($code) as $token) {
        if(is_array($token)) {
           if (in_array(token_name($token[0]), array('T_ECHO', 'T_PRINT'))) {
               $echo_free_code .= '$__temp .= ';
           } else {
               $echo_free_code .= $token[1];
           }
        } else {
            $echo_free_code .= $token;
        }
    }
    $echo_free_code = str_replace($function_name, "__$function_name", $echo_free_code);
    eval("?>$echo_free_code");
}

// Creates a function called "__function_with_echo" that returns a string
// instead of outputting it using "print" and "echo".
change_output_to_return('function_with_echo');

// Stuff contains the outputted data from "function_with_echo".
$stuff = __function_with_echo('fun', 'stuff');
var_dump($stuff);
person Rune Kaagaard    schedule 17.11.2010
comment
Однако не обрабатывает все форматирование PHP. Можно исправить, используя больше токенов. - person Rune Kaagaard; 17.11.2010
comment
Вау - этот код совершенно сумасшедший - я полностью потерялся примерно на полпути :) - person Industrial; 18.11.2010