LoginSignup
8
8

More than 5 years have passed since last update.

【PHPUnitに詳しい人教えて!】 コンストラクタのテスト方法

Posted at

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.
8
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8