Модульное тестирование доктрины ODM - PullRequest
8 голосов
/ 16 марта 2012

Я начал писать модульные тесты Doctrine 2 Mongo ODM, но понял, что в моем коде нет хорошей стратегии для этого.Я хочу запустить тесты и фактически сохранить объекты, но затем я хочу, чтобы мои тестовые данные были легко удалены в tearDown.Имена коллекций и БД должны быть указаны из того, что я видел в аннотациях, и их нельзя переопределить, поэтому я не могу просто создать тестовую БД и стереть ее позже.

Есть ли у кого-нибудь лучшие практики илипримеры того, что они считают наилучшими способами тестирования?

1 Ответ

10 голосов
/ 02 декабря 2012

Вам не нужно сохранять свои объекты.Хороший способ - использовать mock, чтобы проверить, сохранился ли ваш объект.Я приведу вам пример.Допустим, у вас есть класс:

class SomeSerivce
{
     private $dm;

     public function __construct(DocumentManager $dm)
     {
         $this->dm = $dm;
     }

     public function doSomeMagic($someDocument, $someValue)
     {
         $someDocument->setSomeValue($someValue);
         $this->dm->persist($someDocument);
         $this->dm->flush();
     }
 }

Теперь вы не будете проверять, действительно ли документ сохранился, потому что он где-то проверяется с кодом Doctrine.Можно предположить, что методы persist и flush работают нормально.Вам нужно проверить, правильно ли ваш код вызывает эти методы.

Итак, ваш тест может выглядеть так:

 (...)
 public function testDoSomeMagic()
 {
     $documment = new Document();

     // preapre expected object
     $expectedValue = 123;
     $expectedDocument = new Document();
     $expectedDocument->setValue($expectedValue);

     // prepare mock
     $dmMock = $this->getMockBuilder('DocumentManager')
         ->setMethods(array('persist', 'flush'))
         ->disableOriginalConstructor()
         ->getMock();
     $dmMock->expects($this->once())
         ->method('persist');
         ->with($this->equalTo($expectedDocument));
     $dmMock->expects($this->once())
         ->method('flush');

     // new we start testing with the mock
     $someService = new SomeService($dmMock);
     $someService->doSomeMagic($document, $expectedValue);
}
...