このブログははてなブログからの移行記事です。
Laravelのアプリケーションテスト
LaravelでPHPUnitを使うとLaravelによる拡張でアプリケーションテストを行うことが出来る(Laravel 5.1以上)
なので上記ドキュメントに従って以下の様な感じでテストを書いてみた。
<?php class LoginPageTest extends TestCase { public function setUp() { parent::setUp(); } /** * ログインページヘアクセス * * @test */ public function loginPageTest() { $this->visit('/login')->see('ようこそ!'); } }
これでログインページにアクセスし、'ようこそ!'の文字列があるかどうかを見ることが出来る。
はずでした。
エラー
==== Redirecting to composer installed version in vendor/phpunit ====
PHP Fatal error: Call to a member function make() on null in /usr/share/nginx/html/like_award_php/vendor/laravel/framework/src/Illuminate/Foundation/Testing/CrawlerTrait.php on line 682
PHP Stack trace:
PHP 1. {main}() /usr/bin/phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:35
PHP 3. PHPUnit_TextUI_Command->run() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/TextUI/Command.php:100
PHP 4. PHPUnit_TextUI_Command->handleArguments() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/TextUI/Command.php:110
PHP 5. PHPUnit_Util_Configuration->getTestSuiteConfiguration() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/TextUI/Command.php:636
PHP 6. PHPUnit_Util_Configuration->getTestSuite() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Util/Configuration.php:860
PHP 7. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Util/Configuration.php:947
PHP 8. PHPUnit_Framework_TestSuite->addTestFile() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Framework/TestSuite.php:403
PHP 9. PHPUnit_Framework_TestSuite->addTestSuite() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Framework/TestSuite.php:377
PHP 10. PHPUnit_Framework_TestSuite->__construct() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Framework/TestSuite.php:295
PHP 11. PHPUnit_Framework_TestSuite->addTestMethod() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Framework/TestSuite.php:194
PHP 12. PHPUnit_Framework_TestSuite::createTest() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Framework/TestSuite.php:861
PHP 13. LoginPageTest->loginPageTest() /usr/share/nginx/html/like_award_php/vendor/phpunit/phpunit/src/Framework/TestSuite.php:466
PHP 14. Illuminate\Foundation\Testing\TestCase->visit() /usr/share/nginx/html/like_award_php/tests/Integrations/LoginPageTest.php:27
PHP 15. Illuminate\Foundation\Testing\TestCase->makeRequest() /usr/share/nginx/html/like_award_php/vendor/laravel/framework/src/Illuminate/Foundation/Testing/CrawlerTrait.php:50
PHP 16. Illuminate\Foundation\Testing\TestCase->call() /usr/share/nginx/html/like_award_php/vendor/laravel/framework/src/Illuminate/Foundation/Testing/CrawlerTrait.php:151
原因
使い方間違えたかなーと思ってコード呼んだりggったりしてたけど結論としてはPHPの挙動のせいでした。
PHPではクラスのインスタンスが生成される時、クラス名と同じメソッドがあるとそれをコンストラクターとして実行します。
先ほどのテストコードを見るとクラス名と同じテストメソッドを作ってしまったため、setUp()によりアプリケーションが生成される前にテストを実行してしまったのでした。
まとめ
PHP力が足りない
ちなみにPHP7ではこの仕様はなくなるようです。メシア。