簡體   English   中英

dbUnit:可以用數據集創建數據庫嗎?

[英]dbUnit: possible to create database out of a dataset?

是否可以使用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();
    }

如果使用它來設置單元測試,則只需使用數據集斷言查詢結果即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM