php - 用 phpunit 模拟 PDO

标签 php mysql pdo mocking phpunit

我试图模拟 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 表并取回数据,但我不知道该怎么做。

我从模拟 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');
    }

}

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

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

最佳答案

您不必模拟 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'));
    }
}

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 进行测试,它可以是 mysql、sqlite 等...

关于php - 用 phpunit 模拟 PDO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903097/

相关文章:

php - 用字符串中的同义词替换单词

php - 如何在响应中返回数组

php - PHP 中的递归错误

java - 在 Hibernate 中更改生成的外键名称

mysql - Docker - 重新创建后回滚 MySQL 容器中的数据

php - 无法使用pdo和json访问php登录

php - PDO bindValue 适用于其他输入,为什么这个不行?

php 传递 URL

php - 在这种情况下如何查询两个表?

mysql - 纠正 MySQL JOIN 格式以避免嵌套 SELECT