helmich/mongomock

包含用于单元测试的高智能MongoDB模拟库

v2.7.0 2022-06-06 11:55 UTC

README

Unit tests

作者和许可证

Martin Helmich
此库遵循 MIT 许可证

概述和动机

此类包含 MongoDB\CollectionMongoDB\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\CollectionMongoDB\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 已扩展,以便更好地进行测试

  1. 过滤器操作数可以包含应用于文档属性的回调函数

    $r = $collection->find([
        'someProperty' => function($p) {
            return $p == 'bar';
        }
    ]);
  2. 过滤器操作数可以包含 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