PDOを継承した自前のPDOクラスのコンストラクタのテストってどうやったらいいんでしょうか?
やりたいのはPHPUnitのモックを使って _getDefaultAttributes()
が1回呼ばれているかをテストすることです。
PDOTest.php
<?php
namespace Suin;
class PDO extends \PDO
{
/**
* Return new PDO object.
* @param string $dsn
* @param string $username
* @param string $password
* @param array $options
*/
public function __construct($dsn, $username, $password, array $options = array())
{
$options = array_merge($this->_getDefaultAttributes(), $options);
parent::__construct($dsn, $username, $password, $options);
}
/**
* Return default attributes.
* @return array
*/
protected function _getDefaultAttributes()
{
return array(
static::ATTR_STATEMENT_CLASS => array(static::STATEMENT_NORMAL_CLASS),
static::ATTR_ORACLE_NULLS => static::NULL_NATURAL, // NULL is available
static::ATTR_DEFAULT_FETCH_MODE => static::FETCH_ASSOC,
static::ATTR_ERRMODE => static::ERRMODE_EXCEPTION,
static::ATTR_AUTOCOMMIT => true,
);
}
}
class PDOTest extends \PHPUnit_Framework_TestCase
{
public function test__construct()
{
$pdo = $this
->getMockBuilder('\Suin\PDO')
->setConstructorArgs(array('mysql:host=127.0.0.1;dbname=testdb;charset=utf8;', 'root', 'root'))
->setMethods(array('_getDefaultAttributes'))
->getMock();
$pdo
->expects($this->once())
->method('_getDefaultAttributes')
->will($this->returnValue(array()));
}
}
getMock() した時点ですでにコンストラクタが呼ばれているので、うまくいきません。
コマンドライン
$ phpunit PDOTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
E
Time: 0 seconds, Memory: 3.25Mb
There was 1 error:
1) Suin\PDOTest::test__construct
array_merge(): Argument #1 is not an array
/Users/suin/Desktop/PDOTest.php:16
/Users/suin/Desktop/PDOTest.php:44
/Users/suin/.phpenv/versions/5.4.0pear/bin/phpunit:46
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
ためしに、もともとのコンストラクタをOFFってみましたが、
PDOTest.php
<?php
class PDOTest extends \PHPUnit_Framework_TestCase
{
public function test__construct()
{
$pdo = $this
->getMockBuilder('\Suin\PDO')
->setMethods(array('_getDefaultAttributes'))
->disableOriginalConstructor()
->getMock();
$pdo
->expects($this->once())
->method('_getDefaultAttributes')
->will($this->returnValue(array()));
$pdo->__construct('mysql:host=127.0.0.1;dbname=testdb;charset=utf8;', 'root', 'root');
}
}
PDOではうまいように行かないようです…。
コマンドライン
$ phpunit PDOTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
E
Time: 0 seconds, Memory: 3.00Mb
There was 1 error:
1) Suin\PDOTest::test__construct
PDOException: You cannot serialize or unserialize PDO instances
/Users/suin/Desktop/PDOTest.php:44
/Users/suin/.phpenv/versions/5.4.0pear/bin/phpunit:46
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.