jimbojsb / pseudo
PDO/MySQL 连接模拟
Requires (Dev)
- phpunit/phpunit: ^5.0
README
Pseudo 是一个用于模拟 PHP 的 PDO 数据库连接的系统。在编写 PHP 应用程序的单元测试时,通常需要测试与数据库交互的代码。然而,在单元测试的真正精神上,数据库应该被抽象化,因为我们可以在一定程度上确信,诸如数据库服务器网络连接、数据库连接驱动程序以及数据库服务器和软件本身都将“正常工作”,这些都超出了我们单元测试的范围。
这就是 Pseudo 的作用。Pseudo 允许您与数据库进行“模拟”交互,每次都产生预定义的结果。这比实际与数据库交互有两个主要优势。首先,它节省了编写数据固定文件的需要,确保数据模式可用性,加载固定文件,然后在测试之间清理和重置它们。其次,这也有助于测试可以显著更快地运行,因为它们基本上是在与内存对象结构进行交互,而不是承担连接和与实际数据库交互的所有开销。
工作原理理论
总体思路是,Pseudo 通过继承并重写它们的方法来实现 PDO 系统中的所有类。在您的测试期间,在您将 PDO 对象注入到数据层的地方,您现在可以透明地注入一个 Pseudo\Pdo 对象,这使您有 100% 的灵活性来控制您的应用程序现在认为的数据库。在您的单元测试中,您可以使用 SQL 语句和结果数据数组来表示您的测试的模拟。
简单示例
<?php
$p = new Pseudo\Pdo();
$results = [['id' => 1, 'foo' => 'bar']];
$p->mock("SELECT id FROM objects WHERE foo='bar'", $results);
// now use this $p object like you would any regular PDO
$results = $p->query("SELECT id FROM objects WHERE foo='bar'");
while ($result = $results->fetch(PDO::FETCH_ASSOC)) {
echo $result["foo"]; // bar
}
支持的功能
模拟和结果的内部存储是关联数组。Pseudo 尝试尽可能多地实现标准的 PDO 功能集,因此不同的获取模式、绑定、参数化查询等都应该像您期望的那样工作。
未实现/愿望清单项目
- 事务 API 已实现到管理当前事务状态的程度,但事务没有实际效果
- 与滚动游标相关的任何内容都没有实现,包括可能需要它们的获取模式
- Pseudo 可以加载和保存其模拟数据的序列化副本,但在将来,它将能够“记录”一个到真实数据库的 live PDO 连接,然后使用该数据创建来自您的实际数据的模拟
- Pseudo 不兼容严格模式,这意味着测试可能会因签名和偏移等意外的错误而失败(我非常愿意接受一个修复这个问题的 pull request!)
测试
Pseudo 有一个相当健壮的测试套件,使用 PHPUnit 编写。如果您想运行测试,只需在根目录中运行 ./vendor/bin/phpunit
。测试没有外部库依赖(除了 phpunit),并且应该不需要额外的设置或引导来运行。
要求
伪内部目前针对PHP 5.4.0及以上版本。除了PDO扩展之外,没有其他外部依赖,这看起来相当明显。
Pseudo是用错误报告设置为E_ALL & ~(E_NOTICE | E_DEPRECATED | E_STRICT)
构建和测试的。如果你在一个更严格的错误报告模式下运行,你的测试很可能会因为严格的模式方法签名违反而失败。(这是已知问题/待办事项列表中的问题)