使用phpunit模拟PDO

Don*_*lly 15 php mysql phpunit pdo mocking

我正在尝试模拟PDO对象在使用phpunit编写一些测试时使用,但我发现它非常复杂,并且找不到太多关于它的文档.我创建了这个xml结构:

<dataset>
    <table name="providers">
            <column>id</column>
            <column>name</column>
            <column>description</column>
            <row>
                    <value>1</value>
                    <value>provdier_1</value>
                    <value>phpunit first provider</value>
            </row>
    </table>
</dataset>
Run Code Online (Sandbox Code Playgroud)

现在我想查询providers表并获取数据,但我不知道如何做到这一点.

我开始嘲笑PDO对象,但我不明白我应该如何使用它以及如何在getConnection()方法中使用它.我的第一次尝试,我猜它离正确的方式很远,因为我在这里很迷失,看起来像这样:

class AdProvidersTest extends PHPUnit_Extensions_Database_TestCase
{
    public function getConnection()
    {
      $dsn = 'mydb';
      $user = '';
      $password = '';

      $pdo = $this->getMockBuilder('PDOMock')
        ->getMock();

        return $this->createDefaultDBConnection($pdo, 'adserverTesting');
    }

    public function getDataSet()
    {
        return $this->createXMLDataSet('adserverTesting.xml');
    }

}
Run Code Online (Sandbox Code Playgroud)

如何使连接与'adserverTesting.xml'文件交互,如何使用以下行查询它:

$ds = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection());
$ds->addTable('adserverTesting', 'SELECT * FROM providers');
Run Code Online (Sandbox Code Playgroud)

Vla*_*pak 5

您不必模拟PDO.这个例子是如何工作的:

ConnectionTest.php:

<?php

class ConnectionTest extends PHPUnit_Extensions_Database_TestCase
{
    public function getConnection()
    {
        $database = 'myguestbook';
        $user = 'root';
        $password = '';
        $pdo = new PDO('mysql:host=localhost;dbname=myguestbook', $user, $password);
        $pdo->exec('CREATE TABLE IF NOT EXISTS guestbook (id int, content text, user text, created text)');
        return $this->createDefaultDBConnection($pdo, $database);
    }

    public function getDataSet()
    {
        return $this->createFlatXMLDataSet(__DIR__.'/dataSets/myFlatXmlFixture.xml');
    }

    public function testGetRowCount()
    {
        $this->assertEquals(2, $this->getConnection()->getRowCount('guestbook'));
    }
}
Run Code Online (Sandbox Code Playgroud)

myFlatXmlFixture.xml

<?xml version="1.0" ?>
<dataset>
    <guestbook id="1" content="Hello buddy!" user="joe" created="2010-04-24 17:15:23" />
    <guestbook id="2" content="I like it!" user="nancy" created="2010-04-26 12:14:20" />
</dataset>
Run Code Online (Sandbox Code Playgroud)

结果:

PHPUnit 4.7.6 by Sebastian Bergmann and contributors.

.

Time: 215 ms, Memory: 5.25Mb

OK (1 test, 1 assertion)
Run Code Online (Sandbox Code Playgroud)

对db进行测试的要点是不是模拟数据库,而是创建完全相同的PDO连接而不是生产数据库,但是对于db进行测试,它可以是mysql,sqlite等...