PHPUnit测试可以预期致命错误吗?

3

我正在为一个类加载器编写一些单元测试,第一个测试的目的是确认在没有先加载类的情况下尝试引用类时会失败。

该测试如下所示:

/**
 * @expectedException PHPUnit_Framework_Error
 */
public function testInstantiateUnloadedClass() {
    $foo = new Foo();
}

遗憾的是,运行测试时出现以下错误信息:

PHP致命错误:在/Users/jfvaren/workspace/classloader/ClassLoaderTest.php第7行找不到类'Foo'

我必须简单地接受这是不可行的吗?


可能有一种解决方法(通过外部解释器重新调用)。但这并不是单元测试应该完成的任务。(为了简单起见,可以与PHPT结合使用。) - mario
3个回答

4

那似乎是最干净的选择,罗伯特。我只需使用assertFalse(class_exists('Foo'))就能达到同样的效果。谢谢! - Johan Fredrik Varen

2

要测试类是否被实例化,您可以简单地执行以下操作:

try {
     if( !class_exists( "Foo" ) )
          throw new Exception( "Foo does not exist." );
}catch( Exception $e ){
     $e->showMessage();
}

此外,如果你想测试它在实际引用时是否存在(而且你不想先执行class_exists),你可以在AutoLoader中执行此操作。我在下面提供了更多相关信息和一个示例die语句。
关于AutoLoader的注意事项:
现在,可能是题外话,如果你想能够动态地包含一个类而不需要显式地引用它,你可以通过实例化AutoLoader来做到。AutoLoader在引用类时查找类文件,然后在尝试使用它之前将其包含进来。
例如,你需要在Test.php文件中包含AutoLoader.php,以及使用该类的每个其他文件。然后,该文件将包含其他所需的文件。
为此,你需要设置AutoLoader.php文件。它需要看起来像这样:
// This tells PHP what to use to load the functions
ini_set( 'unserialize_callback_func', '__autoload' );

// Create an array pairing class names to their file include path
$myClasses = array( "Foo" => "Foo.php", "Bar" => "Bar.php" );

class AutoLoader {

    static function autoload( $class ){
        if( !in_array( $class, $myClasses ) )
            die( "The class {$class} doesn't exist!" );
        require( $myClasses[$class] );
    }

}

if( function_exists( 'spl_autoload_register' ) ) {
    spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
} else {
    function __autoload( $className ){
        # When called, load a previously unloaded class
        AutoLoader::autoload( $className );
    }
}

1

看起来无法捕获严重错误。因此,可以使用带有if语句的include并生成特定异常,而不是在__autoload中使用require。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接