helmich / mongomock
包含用于单元测试的高智能MongoDB模拟库
资助包维护!
martin-helmich
donate.helmich.me
Requires
- php: ^7.1.0 || ^8.0
- ext-json: *
- ext-mongodb: *
- mongodb/mongodb: ^1.0
- phpunit/phpunit: >=6.0,<10.0
This package is auto-updated.
Last update: 2024-09-18 05:19:46 UTC
README
作者和许可证
Martin Helmich
此库遵循 MIT 许可证。
概述和动机
此类包含 MongoDB\Collection 和 MongoDB\Database 类的实现(不要与已废弃的 mongo 扩展中的 Mongo\Collection 类混淆),可以在内存中存储、修改和过滤文档,同时提供一组(可选)PHPUnit 断言。
我编写这个库是因为我想对使用 MongoDB 集合密集型的库进行单元测试,并觉得使用 PHPUnit 内置的模拟构建器模拟 MongoDB\Collection
类过于限制性。
注意:目前,此实现仅包含实际 MongoDB 集合 API 的子集。我只实现了我使用案例中需要的 API 部分。如果您需要其他功能,请随意提交问题,或者(更好)提交拉取请求。
安装
$ composer require --dev helmich/mongomock
兼容性
此库有多个发布分支,每个分支与 PHPUnit 和 PHP 的不同版本兼容。以下表格应提供易于理解的概览
当您使用 composer require
并已在您的 composer.json
文件中声明对 phpunit/phpunit
的依赖时,Composer 应自动选择最新兼容版本。
使用
您可以使用此库,就像使用 MongoDB\Collection
或 MongoDB\Database
类一样(理论上至少如此——请记住,此包不是完整的 API)
use Helmich\MongoMock\MockCollection; $collection = new MockCollection(); $collection->createIndex(['foo' => 1]); $documentId = $collection->insertOne(['foo' => 'bar'])->insertedId(); $collection->updateOne(['_id' => $documentId], ['$set' => ['foo' => 'baz']]);
差异
在某种程度上,MongoDB\Collection
的 API 已扩展,以便更好地进行测试
-
过滤器操作数可以包含应用于文档属性的回调函数
$r = $collection->find([ 'someProperty' => function($p) { return $p == 'bar'; } ]);
-
过滤器操作数可以包含 PHPUnit 约束(即
PHPUnit_Framework_Constraint
类的实例)。您可以使用PHPUnit_Framework_Assert
类中的工厂函数轻松构建这些约束。$r = $collection->find([ 'someProperty' => \PHPUnit_Framework_Assert::isInstanceOf(\MongoDB\BSON\Binary::class) ]);
测试
要运行测试(任何有运行 Docker 安装的地点)
$ docker-compose run php7phpunit
$ docker-compose run php8phpunit