Можно ли создать структуру базы данных в памяти с DataSet
и не используя SQL для создания структуры?
В настоящее время у меня есть этот код, который работает. Теперь я хотел бы заменить initTable
функция.
class QueryTest extends \PHPUnit_Extensions_Database_TestCase
{
// only instantiate pdo once for test clean-up/fixture load
static private $pdo = null;
// only instantiate PHPUnit_Extensions_Database_DB_IDatabaseConnection once per test
private $conn = null;
// create connection
public function getConnection()
{
if ($this->conn === null) {
if (self::$pdo == null) {
self::$pdo = new \PDO('sqlite::memory:');
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, "db");
self::initTable();
}
return $this->conn;
}
protected function setUp(){
parent::setUp();
//$this->pdo->query('CREATE TABLE `test`;');
}
public function initTable()
{
$query = "CREATE TABLE IF NOT EXISTS `guestbook` (
id INT PRIMARY KEY,
content VARCHAR(50) NOT NULL DEFAULT '',
user VARCHAR(20) NOT NULL DEFAULT'',
created VARCHAR(20) NOT NULL DEFAULT ''
)
";
static::$pdo->query($query);
}
public function getDataSet(){
return $this->createXMLDataSet(dirname(__FILE__) . '/../../_files/database.xml');
}
public function testData()
{
$guestbook = new Guestbook();
$guestbook->addEntry("suzy", "Hello world!", self::$pdo);
$queryTable = $this->getConnection()->createQueryTable(
'guestbook', 'SELECT id, content, user FROM guestbook'
);
$expectedTable = $this->createFlatXmlDataSet(dirname(__FILE__) . '/../../_files/expected.xml')
->getTable("guestbook");
$this->assertTablesEqual($expectedTable, $queryTable);
}
}
class Guestbook
{
public function addEntry($name, $message, $pdo)
{
$pdo->query('INSERT INTO `guestbook` (`id`, `content`, `user`) VALUES (3, "' . $message . '", "' . $name . '");');
}
}
Я мог бы решить мою проблему, используя эту реализацию для модульного теста.
class QueryPlannerTest extends \PHPUnit_Extensions_Database_TestCase
{
/**
* @var type \PDO
*/
static private $pdo = null;
/**
* @var \PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
private $conn = null;
/**
* @var QueryPlanner
*/
protected $testObject;
/**
* Connects to in-memory database and retuns a connection.
*
* @return \PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
public function getConnection()
{
if ($this->conn === null) {
if (self::$pdo == null) {
self::$pdo = new \PDO('sqlite::memory:');
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, "db");
// register the pdo object in the singleton class
$db = Database::getInstance(self::$pdo);
self::initDatabase();
}
return $this->conn;
}
/**
* Returns a dataset for the current tests.
*
* @return \XmlDataSet
*/
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/../../datasource/QueryPlanerTestDatabase.xml');
}
/**
* Initializes the in-memory database.
*/
public static function initDatabase()
{
$query = "CREATE TABLE IF NOT EXISTS `user` (
`iduser` INT UNSIGNED,
`email` VARCHAR(100),
`password` VARCHAR(60),
`salt` VARCHAR(22),
`firstname` VARCHAR(150),
`lastname` VARCHAR(150),
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`activated` TINYINT(1) NOT NULL DEFAULT '0',
`activation_code` VARCHAR(10),
`banned` TINYINT(1) NOT NULL DEFAULT '0')";
self::$pdo->query($query);
}
/**
* Resets the database after each test case.
*
* @return \PHPUnit_Extensions_Database_Operation_Truncate
*/
protected function getTearDownOperation()
{
return \PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE();
}
Если вы используете это для настройки вашего модульного теста, вы можете просто подтвердить результат запроса с вашим набором данных.
Других решений пока нет …