LoginSignup
1
4

More than 5 years have passed since last update.

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

Posted at

発生するエラー

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
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4