2012-03-16 23 views
8

Zacząłem pisać testy jednostek Doctrine 2 Mongo ODM, ale zdałem sobie sprawę, że nie mam dobrej strategii w moim kodzie, aby to zrobić. Chcę uruchomić testy i faktycznie utrzymywać obiekty, ale chcę, aby moje dane testowe mogły być łatwo usunięte w tearDown. Nazwy kolekcji i DB muszą być określone z tego, co widziałem w adnotacjach i nie można ich zastąpić, więc nie mogę po prostu utworzyć testowej bazy danych i zlikwidować ją później.Unit Doctrine Doctrine ODM

Czy ktoś ma najlepsze praktyki lub przykłady najlepszych sposobów testowania?

+0

Wszelkie wskazówki do najlepszych praktyk w jaki sposób powinny być testowanie modeli, które są zachowywane przez doktrynę ODM zostaną docenione. Wydaje się, że nie ma tam zbyt wiele do modelowania. –

Odpowiedz

10

Nie musisz utrzymywać swoich obiektów. Dobrym sposobem jest użycie próbnego sprawdzenia, czy obiekt nie został utracony. Dam ci przykład. Powiedzmy, że masz klasę:

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(); 
    } 
} 

Teraz nie będziesz sprawdzać, czy dokument rzeczywiście był utrwalony, ponieważ jest to gdzieś testowane id Kod Doctrine. Można założyć, że metody persist i flush działają dobrze. Sprawą, którą chcesz sprawdzić, jest to, czy twój kod wywołuje te metody poprawnie.

więc nasz test mógłby wyglądać tak:

(...) 
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); 
} 
+1

Po dodaniu funkcji queryBuilders staje się znacznie bardziej skomplikowana. Propozycje? –