【问题标题】:Test MongoDB Interactions in a PHP Application With Mocking使用 Mocking 在 PHP 应用程序中测试 MongoDB 交互
【发布时间】:2011-12-25 17:16:06
【问题描述】:

高效使用 MongoDB 和 PHPUnit 的最佳实践是什么?我应该(或可以)用什么来模拟访问 MongoDB 的对象? PHPUnit Mocker, Mockery, Phrophecy, Phactory?

【问题讨论】:

  • 是的,我对这个主题还很陌生,我只找到了非常不具体的资源。我只是想确保在这种特定情况下遵循最佳实践:test mongodb in php applications。
  • 我认为,测试的一般建议在这里适用:您编写一些测试,然后再编写一些测试。 PHP 有unit tests,不是吗?
  • 是的,没问题,我使用 phpunit。我的问题更多是关于有效地使用 mongodb,我应该用什么来模拟对象? phpunit 嘲弄者,嘲弄者,工厂?
  • 啊,你应该更新你的问题,让它更清楚。
  • 你想模拟哪些个对象?存在许多模拟解决方案,选择一个适合您的解决方案。如果不知道是哪一个,就从和 PHPUnit 接近的那一个开始吧。

标签: mongodb unit-testing mocking phpunit phactory


【解决方案1】:

如果您查看 SQL 数据库的模拟数据,这里有很多意见。

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

鉴于对 SQL 缺乏共识,您更不可能在 MongoDB 等新数据库上找到共识。

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

  • 您是否使用某种形式的 ORM / ODM?只是司机直接?
  • 您是否试图模拟与数据库的所有通信?您是否要模拟 ODM?

如果您只是想模拟与 DB 的通信,那么理想的解决方案是 MongoDB 驱动程序的“假”实现。这可能需要做很多工作,因为编写驱动程序时从未考虑到“可模拟性”。

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

同样,这个答案可以归结为您真正计划测试的内容以及您认为好的单元测试。不幸的是,这些产品中的大多数仍然很新,因此在这个领域几乎没有指导。

【讨论】:

  • 是的,我希望有更好的解决方案/示例,但我认为“不幸的是,这些产品中的大多数仍然很新,因此在这个领域几乎没有指导。”是对的;)谢谢。
【解决方案2】:

Phactory 提供对模拟 MongoDB 的直接支持。

编辑: 工厂不再维护。不过,我发现了一个名为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']]);

【讨论】:

  • 不幸的是,这些链接已经不存在了。
  • 是的,很遗憾我再也找不到他们的文档了。我将删除链接。
猜你喜欢
  • 2016-06-23
  • 2023-04-02
  • 2014-02-11
  • 2020-03-31
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多