代码之家  ›  专栏  ›  技术社区  ›  Industrial

简单测试:测试echo语句?

  •  2
  • Industrial  · 技术社区  · 15 年前

    我刚刚用simpletest测试了一些PHP文件,发现它在实际输出(回音)任何东西的函数中都不能很好地工作。

    所以我能做些什么来测试那些不使用 ob_buffer() 用PHP?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   DampeS8N    15 年前

    如果您正在测试输出本身的有效性,那么没有。没有输出缓冲区。但是,您可以使用JavaScript测试它。甚至可以通过将输出通过Ajax传递回另一个线程来用simpletest测试它。

    绕来绕去?哦,是的,宝贝。

        2
  •  0
  •   Rune Kaagaard    15 年前

    使用下面的完全愚蠢的方法应该给你想要的。嘿。。。写作很有趣:)

    <?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);
    
    推荐文章