一个用于模拟PHP PDO连接的系统

1.0.4 2024-09-28 20:14 UTC

This package is auto-updated.

Last update: 2024-09-28 20:59:21 UTC


README

简介

Pseudo是一个用于模拟PHP的PDO数据库连接的系统。在编写PHP应用的单元测试时,我们经常需要测试与数据库交互的代码。然而,在单元测试的精神实质中,数据库应该是抽象的,因为我们可以有一定程度的确定性认为,诸如与数据库服务器的网络连接、数据库连接驱动程序以及数据库服务器和软件本身都是“会正常工作的”,这些都超出了我们的单元测试范围。

这就是Pseudo的用武之地。Pseudo允许您与数据库进行“虚假”交互,每次都会产生预定义的结果。这比实际与数据库交互有两个主要优势。首先,它节省了在另一种格式中编写数据固定文件的时间,确保数据模式可用,加载固定文件,然后在测试之间清理和重置它们。其次,这也是第一个优势的结果,因为测试可以显著加快速度,因为它们本质上是在与内存对象结构对话,而不是承担连接和与实际数据库交互的全部开销。

总体思路是,Pseudo通过继承PDO系统中的类并重写它们的方法来实现所有类。在您的测试期间,在您会将PDO对象注入数据层的地方,您现在可以透明地注入Pseudo\Pdo对象,从而完全控制您的应用程序现在认为的数据库。在您的单元测试中,您可以用SQL语句和结果数据数组的形式表达您的模拟。

packagist.org上找到该包

安装

composer require --dev pseudo/pseudo

使用

您可能想要测试的内容

<?php
class ObjectsModel {
    private PDO $pdo;

    public function __construct(private readonly PDO $pdo)
    {
    }
    
    public function getObjectsByFoo(string $foo): array
    {
        $statement = $this->pdo->prepare('SELECT id FROM objects WHERE foo = :foo');

        $statement->execute(['foo' => 'bar']);
        
        $objects = $statement->fetchAll();
        
        if (!$objects) {
            throw new RuntimeException('Entity not found');
        }
        
        return $objects;
    }
}

使用Pseudo的测试

<?php

class ObjectsModelTest extends \PHPUnit\Framework\TestCase {
    public function testGetObjectsByFoo(): void {
        $pdo = new Pseudo\Pdo();

        $objectsModel = new \ObjectsModel($pdo);

        $pdo->mock(
          "SELECT id FROM objects WHERE foo = :foo'", 
          ['foo' => 'bar'],
          [['id' => 1, 'foo' => 'bar']]
        );

        $objects = $objectsModel->getObjectsByFoo('bar');
        
        $this->assertEquals([['id' => 1, 'foo' => 'bar']], $objects);
    }
}

支持的功能

模拟和结果的内存储储是关联数组。Pseudo尽可能地实现了标准的PDO功能集,所以不同的检索模式、绑定、参数化查询等都会按照您期望的方式工作。

未实现/愿望清单项目

  • 事务API已实现到管理当前事务状态的程度,但事务没有实际效果
  • 与滚动游标相关的任何内容都没有实现,这包括可能需要它们的检索模式
  • Pseudo可以加载和保存其模拟数据的序列化副本,但将来它将能够“记录”到真实数据库的实时PDO连接,然后使用这些数据创建从您的实际数据创建的模拟
  • Pseudo与严格模式不兼容,这意味着测试可能会因为签名和偏移量等方面的意外错误而失败。(我非常乐意接受一个修复这个问题的拉取请求!)

测试

Pseudo有一个相当健壮的用PHPUnit编写的测试套件。如果您想运行测试,只需在根目录中运行./vendor/bin/phpunit即可。测试没有外部库依赖(除了PHPUnit)并且应该不需要任何额外的设置或引导即可运行。

要求

Pseudo内部目前针对PHP 8.0及以上版本。它除了PDO扩展之外没有外部依赖,这似乎是很明显的。

Pseudo是用错误报告设置为E_ALL & ~(E_NOTICE | E_DEPRECATED | E_STRICT)构建和测试的。如果您在更严格的错误报告模式下运行,您的测试很可能会因为严格模式方法签名违规而失败。(这是已知问题/待办事项列表中的内容)

贡献

我们致力于透明的开发过程,并非常重视任何形式的贡献。无论您是在帮助我们修复bug、提出新功能、改进我们的文档或传播信息——我们都非常希望您能成为社区的一员。请参考我们的贡献指南和行为准则。

  • bug报告:如果在使用Pseudo时遇到错误信息或问题,请创建一个bug报告。

  • 功能请求:如果您有一个想法或缺失的功能,这将使开发更加便捷和健壮,请提交一个功能请求。

  • 文档请求:如果您在阅读Pseudo文档时觉得遗漏了某些内容,请提交一个文档请求。

许可证

Pseudo是一个在MIT许可证下开源的软件。