phpunit Fixtures
setUp, tearDown
jUnit 처럼 매 테스트마다 호출되어야 하는 메서드가 있다면 setUp 과 tearDown 사용
class HttpTest extends TestCase { protected $http = null; protected function setUp() { $this->http = new HttpClient(); } protected function tearDown() { $this->http = null; } public function testBasicExample() { $this->assertEquals($this->http, null); var_dump($this->http); }
전역 픽스처
클래스 생성전, 파괴전에 한 번만 호출될 전역 메서드가 필요할 경우 setUpBeforeClass,tearDownAfterClass 를 static 으로 구현
class HttpTest extends TestCase { protected $http = null; public static function setUpBeforeClass() { print('setUpBeforeClass'); } public static function tearDownAfterClass () { print('tearDownAfterClass '); } protected function setUp() { $this->http = new HttpClient(); } protected function tearDown() { $this->http = null; } }
문제 해결
Laravel Eloquent 에서 에러 발생
phpunit 으로 단위 테스트시 setUp() 메소드를 추가하면 다음 에러 발생
PHP Fatal error: Call to a member function connection() on a non-object in vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php on line 3146 PHP Stack trace: PHP 1. {main}() C:\util\phpunit.phar:0 PHP 2. PHPUnit_TextUI_Command::main() C:\util\phpunit.phar:612 PHP 3. PHPUnit_TextUI_Command->run() phar://C:/util/phpunit.phar/phpunit/TextUI/Command.php:138 PHP 4. PHPUnit_TextUI_TestRunner->doRun() phar://C:/util/phpunit.phar/phpunit/TextUI/Command.php:186 PHP 5. PHPUnit_Framework_TestSuite->run() vendor\phpunit\phpunit\src\TextUI\TestRunner.php:406 PHP 6. PHPUnit_Framework_TestCase->run() vendor\phpunit\phpunit\src\Framework\TestSuite.php:722 PHP 7. PHPUnit_Framework_TestResult->run() vendor\phpunit\phpunit\src\Framework\TestCase.php:699 PHP 8. PHPUnit_Framework_TestCase->runBare() vendor\phpunit\phpunit\src\Framework\TestResult.php:609 PHP 9. PHPUnit_Framework_TestCase->runTest() vendor\phpunit\phpunit\src\Framework\TestCase.php:743 PHP 10. ReflectionMethod->invokeArgs() vendor\phpunit\phpunit\src\Framework\TestCase.php:866
원인은 parent::setUp() 을 호출하지 않아서 임
public function setUp() { //parent::setUp(); $this->mig = new MigUtils; }