【问题标题】:Can a PHPUnit test expect a fatal error?PHPUnit 测试会出现致命错误吗?
【发布时间】:2011-09-02 20:48:40
【问题描述】:

我正在为类加载器编写一些单元测试,第一个测试是为了断言尝试引用一个类而不先加载它确实会失败。

测试看起来像这样:

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

遗憾的是,运行测试会产生以下消息:

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

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

【问题讨论】:

  • 可能有解决方法(通过外部解释器重新调用)。但这并不是单元测试真正应该完成的。 (为简单起见,请结合 PHPT。)

标签: php unit-testing phpunit fatal-error


【解决方案1】:

调用 class_exists(),这会尝试自动加载类,如果无法自动加载,则返回布尔值 false。

http://php.net/manual/en/function.class-exists.php

【讨论】:

  • 这似乎是最干净的选择,罗伯特。我将只使用 assertFalse(class_exists('Foo')) 来实现相同的目的。谢谢!
【解决方案2】:

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

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

此外,如果您想在实际引用它时测试它是否存在(并且您不想先执行 class_exists),您可以在 AutoLoader 中执行此操作。我在下面包含了更多关于此的内容,以及一个示例 die 语句。

关于自动加载器的说明

现在,可能题外话了,如果您希望能够动态地包含一个类而不显式引用它,您可以通过实例化一个 AutoLoader。 AutoLoaders 在引用类时查找类文件,然后在尝试使用之前将其包含在内。

因此,例如,您需要在 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 );
    }
}

【讨论】:

    【解决方案3】:

    似乎不可能捕捉到 FATAL ERROR。因此,您可以在 if 语句中使用 include 并生成特定的异常,而不是在 __autoload 中使用。

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2012-12-25
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多