用 phpunit 模拟 PDO

2022-08-31 01:18:40

我试图模拟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>

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

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

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');
    }

}

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

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

答案 1

您不必嘲笑PDO。下面是它的工作原理示例:

连接测试.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'));
    }
}

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>

结果:

PHPUnit 4.7.6 by Sebastian Bergmann and contributors.

.

Time: 215 ms, Memory: 5.25Mb

OK (1 test, 1 assertion)

针对db的测试的要点是不要模拟db,但也要创建绝对相同的PDO连接,不是与生产db,而是与db进行测试,它可以是mysql,sqlite等...


答案 2

您是否尝试过查看文档?他们似乎正在使用内存中的sqlite连接的传统对象,就像您尝试的那样,通过加载xml数据来加载它PDO

<?php

class AdProvidersTest extends PHPUnit_Extensions_Database_TestCase
{
    /**
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    public function getConnection()
    {
        $pdo = new PDO('sqlite::memory:');
        return $this->createDefaultDBConnection($pdo, ':memory:');
    }
}

编辑:2020年5月 - 单元测试是为了测试代码单元,而不是为了测试你的数据集。最佳做法是模拟依赖项以返回已知数据集,而不是查询内存中的数据库。查询数据最适合集成测试,集成测试是一组完全不同的测试。查看 https://phpunit.readthedocs.io/en/9.1/test-doubles.html?highlight=database#stubs


推荐