2017-04-02 33 views
0

故事:如何在使用PHPUnit測試「自動加載」時忽略異常?

所以我想實現我的應用程序,將在案件引發異常自動加載,如果命名空間中找不到文件,並在測試我只是確認這是類存在或不...好吧,我試圖檢查它。

我的問題是,我拋出的自動加載的異常,在測試中沒有忽略......並且在測試過程中出現錯誤。 但是我的異常是不是在try catch塊中應該被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

文檔嘗試刪除聲明'$對象=新的$ CLASS_NAME();'在測試類 – Matteo

回答

0

您只能捕獲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: 我會建議使用由作曲家提供使vendor/autoload.php加載類爲好PSR自動加載功能。 因此,您不必實現自己的自動加載器,而只使用作曲家提供的那個。你所要做的就是實現PSR0或PSR4風格來命名和構建你的類文件。

看一看這裏https://getcomposer.org/doc/04-schema.md#autoload

+0

是啊,貌似我只是錯過\默認異常之前。 謝謝! – Butuzov