Тестирование взаимодействия MongoDB в PHP-приложении с помощью Mocking - PullRequest
3 голосов
/ 25 декабря 2011

Какова лучшая практика для эффективной работы с MongoDB и PHPUnit?Что я должен (или мог) использовать для насмешки объектов, которые обращаются к MongoDB? PHPUnit Mocker , Издевательство , Фрофия , Phactory ?

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Если вы посмотрите на фиктивные данные для баз данных SQL, здесь есть много мнений.

  • Некоторые люди предлагают использовать базу данных SQL в памяти.
  • Некоторые люди просто насмехаются над вызовами ORM и предполагают, что часть ORM к БД протестирована.
  • Некоторые люди просто используют «локальную» БД для модульного тестирования и просто игнорируют концепцию «насмешки».

Учитывая отсутствие консенсуса по SQL, еще менее вероятно, что вы найдете консенсус поновые базы данных, такие как MongoDB.

Я думаю, что здесь есть несколько важных деталей, которые нужно рассмотреть.

  • Используете ли вы какую-либо форму ORM / ODM?Только драйвер напрямую?
  • Вы пытаетесь издеваться над всеми коммуникациями с БД?Вы пытаетесь смоделировать ODM?

Если вы просто пытаетесь смоделировать связь с БД, то идеальным решением является «поддельная» реализация драйвера MongoDB.Вероятно, это большая работа, так как драйвер никогда не был написан с учетом «насмешливости».

Если у вас есть ODM, вы можете просто смоделировать вызовы ODM и предположить, что ODM выполняет свою работу.В идеале ODM должен обеспечивать какой-то забавный интерфейс, но это не всегда так.

Опять же, этот ответ возвращается к тому, что вы действительно планируете тестировать, и к тому, что вы считаете хорошим модульным тестом.К сожалению, большинство из этих продуктов все еще очень новы, поэтому в этой области очень мало рекомендаций.

1 голос
/ 11 мая 2015

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