Last active
December 8, 2017 10:55
-
-
Save nojimage/78b18b8cf1449772180f4f2c82db2440 to your computer and use it in GitHub Desktop.
CakePHP Fixture Module for Codeception
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Codeception\Module; | |
use Cake\TestSuite\Fixture\FixtureManager; | |
use Codeception\Module; | |
use Codeception\Test\Cest; | |
use Codeception\TestInterface; | |
use Exception; | |
use stdClass; | |
/** | |
* CakePHP Fixture Module | |
* | |
* @see Cake\TestSuite\Fixture\FixtureInjector | |
*/ | |
class CakeFixture extends Module | |
{ | |
/** | |
* @var array | |
*/ | |
protected $config = [ | |
// pass to FixtureManager's debug option | |
'debug' => false, | |
// default $autoFixtures property | |
'autoFixtures' => true, | |
// default $dropTables property | |
'dropTables' => true, | |
]; | |
/** | |
* The instance of the fixture manager to use | |
* | |
* @var FixtureManager | |
*/ | |
protected $fixtureManager; | |
/** | |
* Current TestCase | |
* | |
* @var stdClass | |
*/ | |
protected $testCase; | |
/** | |
* Load FixtureManager | |
*/ | |
public function _initialize() | |
{ | |
$manager = new FixtureManager(); | |
$manager->setDebug($this->_getConfig('debug')); | |
$this->fixtureManager = $manager; | |
$this->fixtureManager->shutDown(); | |
$this->debugSection('Fixture', 'Initialized FixtureManager, debug=' . (int)$this->_getConfig('debug')); | |
} | |
/** | |
* Destroys the fixtures created by the fixture manager at the end of | |
* the test suite run | |
*/ | |
// @codingStandardsIgnoreStart | |
public function _afterSuite()// @codingStandardsIgnoreEnd | |
{ | |
$this->testCase = null; | |
$this->fixtureManager->shutDown(); | |
$this->debugSection('Fixture', 'FixtureManager shutDown'); | |
} | |
/** | |
* Adds fixtures to a test case when it starts. | |
* | |
* @param TestInterface $test The test case | |
* @return void | |
*/ | |
// @codingStandardsIgnoreStart | |
public function _before(TestInterface $test)// @codingStandardsIgnoreEnd | |
{ | |
if ($this->hasFixtures($test)) { | |
$this->debugSection('Fixture', 'Test class is: ' . get_class($test->getTestClass())); | |
$this->testCase = $this->setRequireProperties($test->getTestClass()); | |
$this->fixtureManager->fixturize($this->testCase); | |
$this->debugSection('Fixture', 'Load fixtures: ' . implode(', ', $this->testCase->fixtures)); | |
$this->fixtureManager->load($this->testCase); | |
} | |
} | |
/** | |
* Unloads fixtures from the test case. | |
* | |
* @param TestInterface $test The test case | |
* @return void | |
*/ | |
// @codingStandardsIgnoreStart | |
public function _after(TestInterface $test)// @codingStandardsIgnoreEnd | |
{ | |
if ($this->hasFixtures($test)) { | |
$this->debugSection('Fixture', 'Unload fixtures: ' . implode(', ', $test->getTestClass()->fixtures)); | |
$this->fixtureManager->unload($test->getTestClass()); | |
} | |
$this->testCase = null; | |
} | |
/** | |
* Chooses which fixtures to load for a given test | |
* | |
* Each parameter is a model name that corresponds to a fixture, i.e. 'Posts', 'Authors', etc. | |
* Passing no parameters will cause all fixtures on the test case to load. | |
* | |
* @return void | |
* @see Cake\TestSuite\TestCase::loadFixtures() | |
* @throws Exception when no fixture manager is available. | |
*/ | |
public function loadFixtures() | |
{ | |
$args = func_get_args(); | |
foreach ($args as $class) { | |
$this->fixtureManager->loadSingle($class, null, $this->testCase->dropTables); | |
} | |
if (empty($args)) { | |
$autoFixtures = $this->testCase->autoFixtures; | |
$this->testCase->autoFixtures = true; | |
$this->fixtureManager->load($this); | |
$this->testCase->autoFixtures = $autoFixtures; | |
} | |
} | |
/** | |
* check test class has $fixtures | |
* | |
* @param Cest $test | |
* @return bool | |
*/ | |
private function hasFixtures($test) | |
{ | |
return $test instanceof Cest && property_exists($test->getTestClass(), 'fixtures'); | |
} | |
/** | |
* set required properties to test class | |
* | |
* @param stdClass $testClass | |
* @return stdClass | |
*/ | |
private function setRequireProperties($testClass) | |
{ | |
if (!property_exists($testClass, 'autoFixtures')) { | |
$testClass->autoFixtures = $this->_getConfig('autoFixtures'); | |
} | |
if (!property_exists($testClass, 'dropTables')) { | |
$testClass->dropTables = $this->_getConfig('dropTables'); | |
} | |
return $testClass; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Codeception の Cest で、 CakePHP の Fixture を読み込めるようにするモジュール