如何在测试时忽略异常" autoload"用PHPUnit?

时间:2017-04-02 18:41:58

标签: php exception exception-handling phpunit

故事:

所以我正在尝试为我的应用程序实现自动加载器,如果找不到命名空间中的文件,将抛出异常,并且在测试中我只是检查这个类是否存在...好吧我正在尝试检查它。

我的问题,我抛出的自动加载异常,在测试中没有被忽略......我在测试过程中遇到错误。 但是,我的异常是在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?

1 个答案:

答案 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样式来命名和构造类文件。

请查看此处的文档https://getcomposer.org/doc/04-schema.md#autoload