2015-07-01 6 views
2

Как я могу создать экземпляр класса pdo в PHPUnit_Framework_TestCase?PHPUnit - Как создать экземпляр класса pdo в PHPUnit_Framework_TestCase?

, например, это мой \test\SuitTest.php,

namespace Test; 

use PHPUnit_Framework_TestCase; 

class SuiteTest extends PHPUnit_Framework_TestCase 
{ 
    protected $PDO = null; 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->PDO = new \Foo\Adaptor\PdoAdaptor(); // the pdo is not instantiated at all - I think! 
    } 

    protected function truncateTables ($tables) 
    { 
     foreach ($tables as $table) { 
      $this->PDO->truncateTable($table); 
     } 
    } 

    /** 
    * DO NOT DELETE, REQUIRED TO AVOID FAILURE OF NO TESTS IN FILE 
    * PHPUnit is ignoring the exclude in the phpunit.xml config file 
    */ 
    public function testDummyTest() 
    { 
    } 
} 

Я хочу использовать класс PDO, что я использую его для разработки и производства, что в, \app\source\Adaptor\PdoAdaptor.php,

<?php 

namespace Foo\Adaptor; 

use PDO; 

class PdoAdaptor 
{ 
    protected $PDO = null; 
    protected $dsn = 'mysql:host=localhost;dbname=phpunit', $username = 'root', $password = 'xxxx'; 

    /* 
    * Make the pdo connection. 
    * @return object $PDO 
    */ 
    public function connect() 
    { 
     try { 
      $this->PDO = new PDO($this->dsn, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
      $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

      // Unset props. 
      unset($this->dsn); 
      unset($this->username); 
      unset($this->password); 
     } catch (PDOException $error) { 
      // Call the getError function 
      $this->getError($error); 
     } 
    } 

    public function truncateTable($table) 
    { 
     $sql = "TRUNCATE TABLE $table"; 
     $command = $this->PDO->prepare($sql); 
     $command->execute(); 
    } 
} 

Я получаю эта ошибка при запуске phpunit для тестирования моих кодов,

Fatal error: Call to a member function prepare() on null

pdo не создается вообще внутри метода construct в SuiteTes t - я думаю!

Это мой реж структура,

enter image description here

+1

Кроме того, ваше исключение не игнорируется; что исключение для покрытия кода, а не какие тесты должны быть запущены – Amelia

+0

извините, я не получаю это ... – laukok

+0

Комментарий к phpunit не игнорирует ваши тесты в вашем вопросе; phpunit не игнорирует тесты. Он игнорирует классы при использовании опций '--coverage- *' – Amelia

ответ

2

Используйте метод setUpBeforeClass (примечание: оно статическое)

protected static $pdo; 

public static function setUpBeforeClass() 
{ 
    static::$pdo = new PdoAdapter(); 
} 

Затем просто получите доступ к вашему экземпляру pdo с static::$pdo или self::$pdo в ваших тестах.

+0

это отлично выглядит. Благодарю. – laukok

1

Вы должны использовать метод установки вместо перезаписи конструктор PHPUnit_Framework_TestCase, т.е. просто заменить определение конструктора в классе SuiteTest с:

public function setup() 
{ 
    $this->PDO = new \Foo\Adaptor\PdoAdaptor(); 
} 
+0

хорошо пункт. Благодарю. – laukok

Смежные вопросы