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

时间:2011-12-25 17:16:06

标签: mongodb unit-testing mocking phpunit phactory

使用MongoDB和PHPUnit高效工作的最佳做​​法是什么?应该(或可以)使用什么来模拟访问MongoDB的对象? PHPUnit MockerMockeryPhrophecyPhactory

2 个答案:

答案 0 :(得分:2)

如果你看一下SQL数据库的模拟数据,这里有很多意见。

  • 有些人建议使用内存中的SQL数据库。
  • 有些人只是模拟ORM调用并假设ORM到DB部分已经过测试。
  • 有些人只是使用“本地”数据库进行单元测试,而忽略了整个“嘲弄”概念。

鉴于对SQL缺乏共识,你甚至不太可能在像MongoDB这样的新数据库上找到共识。

我认为这里有一些重要的细节需要考虑。

  • 您使用的是某种形式的ORM / ODM吗?只是司机?
  • 您是否正在尝试模拟与数据库的所有通信?你想嘲笑ODM吗?

如果您只是想模拟与DB的通信,那么理想的解决方案是MongoDB驱动程序的“假”实现。这可能是很多工作,因为驱动程序从来没有考虑过“可模仿性​​”。

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

同样,这个答案可以追溯到你真正计划测试的内容以及你认为是一个好的单元测试。不幸的是,大多数这些产品仍然很新,所以在这个领域几乎没有什么指导。

答案 1 :(得分:0)

Phactory为模拟MongoDB提供直接支持。

编辑:不再维护Phactory。但是,我发现了一个名为php-mongomock的新项目似乎解决了这个问题:

<?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']]);