2010-11-17 2 views
2

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

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

Благодаря

+1

:-) зачем использовать функции для эха? – zod

+0

@zod, если это было так просто, то почему бы просто не сделать??> Hello World Gordon

+0

Ни одна из основанных на JUnit API фреймворков (PHPUnit, SimpleTest, SnapTest) не может сделать это (без обходных решений). Для необработанного тестирования функциональности PHP попробуйте скрипты '.phpt'. – mario

ответ

1

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

Круглый? О да, детка.

0

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

<?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); 
+0

Не обрабатывает все PHP-форматирование. Может быть исправлено с помощью токенов. –

+0

Whoa - этот код совершенно сумасшедший - я потерялся почти наполовину :) – Industrial