Как проверить PHP PDO Singleton Class? - PullRequest
2 голосов
/ 22 марта 2012

PHP PDO Singleton Класс:

<?php

require_once('app/config.php'); // Require constants HOST, DATABASE, USER, PASSWORD

/*

dbConnection class.

Manages connections to and operations on the database. Call dbConnection::getInstance() to return an instance.
Prepare your statements by calling prepareQuery() on the object

Attribute list:

$instance:
> Static self instance to manage database resource

$connection:
> Holds connection resource

$sth:
> Statement handler variable. Handles SQL statements.
_______________________________________________________________________________________________________________

Method list:

getInstance():
> Creates or returns existing connection to the database

prepareQuery():
> Prepares the $sth variable for execution.

bindParameter():
> Binds parameters to the $sth variable.

numRows($query):
> Returns the number of returned from a query

runQuery():
> Executes the current statement on the database

fetchRow():
> Executes the current statement then returns an associative array

fetchObj($className, $parameters = NULL):
> Executes the current statement and returns an object of your specification. Also takes additional parameters to pass to the object's constructor.


*/

class dbConnection
{   
    private static $instance = NULL;
    private $connection;
    private $sth;

    function __construct()
    {
        $this->connection = new PDO('mysql:host=' . HOST . ';dbname=' . DATABASE, USER, PASSWORD);
    }

    function getInstance()
    {
        if (self::$instance == NULL)
            self::$instance = new dbConnection();
        return self::$instance;
    }

    function prepareQuery($query)
    {
        $this->sth = $this->connection->prepare($query);
    }

    function bindParameter($number, $value)
    {
        $this->sth->bindParam($number, $value);
    }

    function numRows()
    {   
        try
        {
            $this->sth->execute();

            $count = $this->sth->rowCount();
            return $count;
        }
        catch(PDOException $e)
        {
            echo __LINE__.$e->getMessage();
        }
    }

    function runQuery()
    {
        try
        {
            $this->sth->execute() or print_r($connection->errorInfo());
        }
        catch(PDOException $e)
        {
            echo __LINE__.$e->getMessage();
        }
    }

    function fetchRow()
    {
        try
        {
            $this->sth->setFetchMode(PDO::FETCH_ASSOC);
            $this->sth->execute();
            return $this->sth;
        }
        catch(PDOException $e)
        {
            echo __LINE__.$e->getMessage();
        }
    }

    function fetchObj($className, $parameters = NULL)
    {
        try
        {
            $this->sth->setFetchMode(PDO::FETCH_CLASS, $className, $parameters);
            $this->sth->execute();
            return $this->sth;
        }
        catch(PDOException $e)
        {
            echo __LINE__.$e->getMessage();
        }
    }
}
?>

Как проверить синглтон? Возьмите объект за раз, который закрыт, когда вы закончите с объектом в конце.

Ответы [ 2 ]

5 голосов
/ 22 марта 2012

Я думаю, что вы неправильно используете паттерн Синглтона здесь.

Тем не менее, тестирование Singletons возможно. Цитирование Тестирование кода, который использует Singletons

PHPUnit имеет механизм резервного копирования / восстановления статических атрибутов классов.

Это еще одна особенность PHPUnit, которая упрощает тестирование кода, использующего глобальное состояние (которое включает, но не ограничивается, глобальные и суперглобальные переменные, а также статические атрибуты классов).

Также см. http://www.phpunit.de/manual/current/en/fixtures.html#fixtures.global-state

Аннотация @backupStaticAttributes, которая обсуждается в разделе и называется «@backupStaticAttributes» , может использоваться для управления операциями резервного копирования и восстановления статических атрибутов. В качестве альтернативы вы можете предоставить черный список статических атрибутов, которые должны быть исключены из операций резервного копирования и восстановления, например

Так что, если вы хотите отключить резервное копирование, вы бы сделали

class MyPdoTest extends PHPUnit_Framework_TestCase
{
    protected $backupStaticAttributesBlacklist = array(
      'dbConnection' => array('instance')
    );    

    // more test code
}

Также ознакомьтесь с главой Проверка базы данных

1 голос
/ 22 марта 2012

Синглтоны - плохие новости, как я объяснил здесь .

Если говорить более конкретно на ваш вопрос, то синглтоны чрезвычайно сложны для юнит-теста. Что является одной из причин, почему они плохие новости.

Используйте взамен .

РЕДАКТИРОВАТЬ ДОБАВИТЬ:

Полагаю, вы могли бы написать набор модульных тестов, где каждый модульный тест находится в своем собственном наборе тестов, а все наборы тестов настроены для запуска в отдельном процессе. Это должно изолировать каждый модульный тест от других.

Впрочем, производительность была бы ужасной, и вам было бы лучше, если бы вместо этого вы использовали подход DI.

(я предполагаю, что вы используете для своих модульных тестов здесь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...