实际上connor / pseudo
一个用于模拟PHP PDO连接的系统
Requires
- php: >=8.0
- ext-ctype: *
- ext-pdo: *
Requires (Dev)
- phpunit/php-code-coverage: ^9.2|^10.1|^11.0
- phpunit/phpunit: ^9.6|^10.5|^11.3
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许可证下开源的软件。