発生するエラー
FuelPHPのユニットテストで --file オプションをつけると、以下のようなFatal errorが発生する。
(php oil test 実行時には Fatal error は発生しない)
もちろん、fuel/core/classes/cli.php
の中で class Cli{}
は定義されている。
$ php oil test --file=./fuel/app/tests/utils_test.php
Tests Running...This may take a few moments.
PHPUnit 3.7.38 by Sebastian Bergmann.
Configuration read from /PATH/TO/PROJECT/fuel/app/phpunit.xml
.F
Time: 268 ms, Memory: 10.50MB
There was 1 failure:
1) utils_Test::test_HOGEHOGE
Failed asserting that false matches expected true.
/PATH/TO/PROJECT/fuel/app/tests/utils_test.php:29
FAILURES!
Tests: 2, Assertions: 3, Failures: 1.
Fatal error: Uncaught exception 'Exception' with message 'File "COREPATH/classes/cli.php" does not contain class "Fuel\Core\Cli"' in /PATH/TO/PROJECT/fuel/core/classes/autoloader.php:397
Stack trace:
#0 /PATH/TO/PROJECT/fuel/core/classes/autoloader.php(236): Fuel\Core\Autoloader::init_class('Fuel\\Core\\Cli', '/Users/XXXX/Do...')
#1 [internal function]: Fuel\Core\Autoloader::load('Fuel\\Core\\Cli')
#2 [internal function]: spl_autoload_call('Fuel\\Core\\Cli')
#3 /PATH/TO/PROJECT/fuel/core/classes/autoloader.php(247): class_alias('Fuel\\Core\\Cli', 'Cli')
#4 [internal function]: Fuel\Core\Autoloader::load('Cli')
#5 /PATH/TO/PROJECT/fuel/core/bootstrap.php(62): spl_autoload_call('Cli')
#6 [internal function]: PHPUnit_Util_Fileloader::{closure}()
#7 {main}
thrown in /PATH/TO/PROJECT/fuel/core/classes/autoloader.php on line 397
対処方法
ユニットテスト起動時に、ダミーとして $tmp = new cli()
を実行することで回避できる。
そのためには、以下の2点の変更点が必要。
- phpunit実行時のbootstrapファイルを変更
- bootstrap時に上記ダミーを実行
phpunit実行時のbootstrapファイルを変更
基本のbootstrapファイルをカスタマイズ用にコピー
$ cp -p fuel/core/bootstrap_phpunit.php fuel/app
fuel/app/phpunit.xml
-<phpunit colors="true" stopOnFailure="false" bootstrap="../core/bootstrap_phpunit.php" backupGlobals="false">
+<phpunit colors="true" stopOnFailure="false" bootstrap="bootstrap_phpunit.php" backupGlobals="false">
bootstrap時にダミーを実行
fuel/app/bootstrap_phpunit.php
(略)
$tmp = new cli();
$tmp = new Crypt();
Appendix
$tmp = new Crypt();
も追加する理由。
new cli();
だけだと、以下のようなエラーが発生するため。
Error: File "COREPATH/classes/crypt.php" does not contain class "Fuel\Core\Crypt" in /PATH/TO/PROJECT/fuel/core/classes/autoloader.php on 397