Help us understand the problem. What is going on with this article?

FuelPHPのPHPUnitテスト時に、ファイルを指定するとエラーが発生する場合の対処方法

More than 3 years have passed since last update.

発生するエラー

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点の変更点が必要。

  1. phpunit実行時のbootstrapファイルを変更
  2. 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
gigatune
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away