kevinkl3/mongomock

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


README

Unit tests

作者和许可

Martin Helmich
此库使用MIT许可

概述和动机

此类包含对MongoDB\CollectionMongoDB\Database类的实现(不要与已废弃的mongo扩展中的Mongo\Collection类混淆),这些类可以存储、修改和过滤内存中的文档,同时附带一系列(可选)PHPUnit断言。

我编写这个库是因为我想对一个大量使用MongoDB集合的库进行单元测试,并觉得使用PHPUnit内置的mock生成器模拟MongoDB\Collection类过于受限。

注意:目前,此实现仅包含实际MongoDB集合API的一部分。我只实现了我使用案例中需要的API部分。如果您需要其他功能,请随意提出问题,或者(更好的是)提交一个pull request。

安装

$ 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