До сих пор я понял, что: Должен ли я создать базу данных testdb или это все эмулируется / виртуально?
Это создает реальную базу данных и, используя метод getSetUpOperation, этоочень медленный, поскольку таблицы усекаются и повторно импортируются для каждого теста, и это требует большого количества жесткого диска даже для небольшого объема данных.(~ 1 сек / тест)
Я видел много примеров использования sqlite :: memory:, это хорошая идея для тестирования запросов на основе MySQL с sqlite?Могу ли я использовать mysql :: memory: вместо этого?
Я до сих пор не знаю.Я думаю, что теперь это действительно возможно с MySQL.
Если это настоящая БД, как мне восстановить все данные из dbData.xml в БД перед каждым запуском теста?
Есть getSetUpOperation и getTearDownOperation, которые действуют как метод setup и tearDown.Добавление этого приведет к обрезанию таблицы, упомянутой в dataSet, и повторной вставке всех данных этого XML-файла:
/**
* Executed before each
*
* @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
*/
protected function getSetUpOperation()
{
return PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
}
Где я должен вызывать getConnection () и getDataSet ()?
Нигде.Тезисы - магический метод, который вызывается автоматически.getConnection вызывается перед тестами (немного похоже на __construct, но я не уверен насчет порядка), а getDataSet будет вызываться, когда нужен dataSet.Я думаю , что в моем случае только getSetUpOperation имеет зависимость для dataSet ... поэтому в фоновом режиме он вызывает метод getDataSet перед каждым тестом для выполнения операции CLEAN_INSERT.
Кроме того,Я обнаружил, что нам нужно создать структуру таблицы (набор данных не обрабатывает это), поэтому мой полный --slow- рабочий код:
<?php
require_once 'PHPUnit/Extensions/Database/TestCase.php';
class NewsFactoryTest extends PHPUnit_Extensions_Database_TestCase
{
/**
* Custom PDO instance required by the SUT.
*
* @var Core_Db_Driver_iConnector
*/
protected $db;
/**
* Create a connexion.
* Note: les constantes de connexion sont définit dans bootstrap.php.
*
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
protected function getConnection()
{
//Instanciate the connexion required by the system under test.
$this->db = new Core_Db_Driver_PDO('mysql:host=' . TEST_DB_HOST . ';dbname=' . TEST_DB_BASE, TEST_DB_USER, TEST_DB_PASS, array());
//Create a genuine PDO connexion, required for PHPUnit_Extensions_Database_TestCase.
$db = new PDO('mysql:host=' . TEST_DB_HOST . ';dbname=' . TEST_DB_BASE, TEST_DB_USER, TEST_DB_PASS);
$this->createTableSchema($db);
return $this->createDefaultDBConnection($db, TEST_DB_BASE);
}
/**
* Load the required table schemes.
*
* @param PDO $db
* @return void
*/
protected function createTableSchema(PDO $db)
{
$schemaPath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sql_schema' . DIRECTORY_SEPARATOR;
$query = file_get_contents($schemaPath . 'news.sql');
$db->exec($query);
$query = file_get_contents($schemaPath . 'news_locale.sql');
$db->exec($query);
}
/**
* Load the dataSet in memory.
*
* @return PHPUnit_Extensions_Database_DataSet_IDataSet
*/
protected function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'newsFactory_dataSet.xml');
}
/**
* Method executed before each test
*
* @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
*/
protected function getSetUpOperation()
{
//TRUNCATE the table mentionned in the dataSet, then re-insert the content of the dataset.
return PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
}
/**
* Method executed after each test
*
* @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
*/
protected function getTearDownOperation()
{
//Do nothing ( yup, their's a code for that )
return PHPUnit_Extensions_Database_Operation_Factory::NONE();
}
/**
* @covers NewsFactory::getNewsById
*/
public function testGetNewsById()
{
$newsFactory = new NewsFactory($this->db);
$news = $newsFactory->getNewsById(999);
$this->assertFalse($news);
}
}
Надеюсь, что это поможет другим людям, которым нужны некоторыедополнительные объяснения.Если у вас есть какие-либо комментарии, предложения или идеи, ваш вклад приветствуется, так как я не считаю это решение полностью эффективным.(Медленно и долго настраивается и требует двойного соединения.)