故事:
所以我正在尝试为我的应用程序实现自动加载器,如果找不到命名空间中的文件,将抛出异常,并且在测试中我只是检查这个类是否存在...好吧我正在尝试检查它。
我的问题,我抛出的自动加载异常,在测试中没有被忽略......我在测试过程中遇到错误。 但是,我的异常是在tryUnder块中应该被PHPUnit忽略吗?
spl_autoload_register( function ( $class_name ) {
if ( strpos( $class_name, 'App' ) !== false ) {
$class_file = strtolower( $class_name );
$class_file = str_replace( '\\', '-', $class_file );
$class_file = str_replace( 'app-', '', $class_file );
$class_file = sprintf( 'class-%s.php', $class_file );
$class_file = dirname( __DIR__ ) . '/includes/' . $class_file;
if ( file_exists( $class_file ) ) {
include_once $class_file;
if ( ! class_exists( $class_name ) ) {
throw new Exception( sprintf( 'Can\'t load %s class.', $class_name ));
}
} else {
// do not throw path of the file.
throw new Exception( sprintf( 'Can\'t find %s class file.', $class_name ) );
}
}
});
正如你可以看到它非常简单的代码。
require dirname( __DIR__ ) . '/vendor/autoload.php';
use PHPUnit\Framework\TestCase;
class ExceptionsTest extends TestCase {
/**
* @dataProvider data_existing_namespace
*/
public function test_existing_namespaces( $class_name, $class_exists ) {
try {
$object = new $class_name();
if ( $class_exists === true ){
$this->assertTrue( class_exists( $class_name ) );
} else {
$this->assertFalse( class_exists( $class_name ) );
}
} catch( Exception $e ) {
// do nothing.
}
}
/**
* Data provider for test_Namespace_Autoload
*/
public function data_existing_namespace() {
return [
[ '\App', true ],
[ '\App\Settings', false ],
];
}
}
但是......我仍然遇到这个错误,我应该(如果我理解的话)抓住它。
There was 1 error:
1) Tests\ExceptionTest::test_existing_namespaces with data set #1 ('\App\Settings', false)
Exception: Can't find App\Settings class file.
我该怎么办才能解决这个错误并只使用AssertFalse或AssertTrue?
答案 0 :(得分:1)
您只是捕获PHPUnit\Framework\TestCase\Exception
,因为您的测试位于此命名空间中,而您只使用Exception
而没有任何命名空间或使用语句。
您只需要为异常f.e指定完整的命名空间。 \Exception
或者您可以在文件顶部使用use
use Exception;
语句。
try {
$object = new $class_name();
if ( $class_exists === true ){
$this->assertTrue( class_exists( $class_name ) );
} else {
$this->assertFalse( class_exists( $class_name ) );
}
// catch all exception possible \Excecption
// maybe use \My\Namespace\Exception or something
} catch( \Exception $e ) {
// do nothing.
}
PS:
我建议使用composer提供的PSR自动加载器功能,以便vendor/autoload.php
加载您的类。
因此,您不必实现自己的自动加载器,而只使用作曲家提供的自动加载器。您所需要做的就是实现PSR0或PSR4样式来命名和构造类文件。