使用Mocking在PHP应用程序中测试MongoDB交互

使用Mocking在PHP应用程序中测试MongoDB交互,mongodb,unit-testing,mocking,phpunit,phactory,Mongodb,Unit Testing,Mocking,Phpunit,Phactory,与MongoDB和PHPUnit高效合作的最佳实践是什么?我应该(或者可以)使用什么来模拟访问MongoDB的对象 如果您查看SQL数据库的模拟数据,这里有很多观点 有些人建议使用内存中的SQL数据库 有些人只是模拟ORM调用,并假设ORM到DB部分已经过测试 有些人只是使用“本地”DB进行单元测试,而忽略了整个“模拟”概念 鉴于对SQL缺乏共识,您甚至不太可能在MongoDB这样的新DBs上找到共识 我认为这里有一些重要的细节要考虑。< /P> 您正在使用某种形式的ORM/ODM吗?直接

与MongoDB和PHPUnit高效合作的最佳实践是什么?我应该(或者可以)使用什么来模拟访问MongoDB的对象

如果您查看SQL数据库的模拟数据,这里有很多观点

  • 有些人建议使用内存中的SQL数据库
  • 有些人只是模拟ORM调用,并假设ORM到DB部分已经过测试
  • 有些人只是使用“本地”DB进行单元测试,而忽略了整个“模拟”概念
鉴于对SQL缺乏共识,您甚至不太可能在MongoDB这样的新DBs上找到共识

我认为这里有一些重要的细节要考虑。< /P>
  • 您正在使用某种形式的ORM/ODM吗?直接找司机
  • 您是否试图模拟与DB的所有通信?你是在嘲笑ODM吗
如果您只是试图模拟与DB的通信,那么理想的解决方案是MongoDB驱动程序的“伪”实现。这可能需要做很多工作,因为编写驱动程序时从来没有考虑过“可模仿性”

如果您有一个ODM,那么您可以简单地模拟ODM调用并假设ODM正在完成它的工作。理想情况下,ODM应该提供一些可模拟的接口,但情况并非总是如此

同样,这个答案又回到了你真正打算测试的,以及你认为是一个好的单元测试。不幸的是,这些产品中的大多数仍然是非常新的,因此在这方面没有什么指导。

提供了对mockmongodb的直接支持

编辑:不再维护属性。然而,我发现一个名为的新项目似乎解决了这个问题:

<?php

use Helmich\MongoMock\MockCollection;

$collection = new MockCollection();
$collection->createIndex(['foo' => 1]);

$documentId = $collection->insertOne(['foo' => 'bar'])->insertedId();
$collection->updateOne(['_id' => $documentId], ['$set' => ['foo' => 'baz']]);

是的,我对这门学科相当陌生,我只找到了非常不具体的资源。我只是想确保在这种特定情况下遵循最佳实践:在php应用程序中测试mongodb。我认为,测试的一般建议适用于这里:您编写一些测试,然后再编写一些测试。PHP有,不是吗?是的,没问题,我用的是phpunit。我的问题更多的是关于如何高效地使用mongodb,我应该使用什么来模拟对象?phpunit mocker,mockery,phactory?啊,你应该更新你的问题,让它更清楚。你想模拟哪些对象?有很多嘲弄的解决方案,选择一个适合你的。如果您不知道是哪一种,请从接近PHPUnit的产品开始。是的,我希望有更好的解决方案/示例,但我认为“不幸的是,这些产品中的大多数仍然是非常新的,因此在这一领域几乎没有指导。”是正确的;)Thx。不幸的是那些链接已经不存在了。是的,不幸的是我再也找不到他们的文档了。我将删除链接。