Jak tworzyć testy w jednostkach Doctrine bez ich utrzymywania (jak ustawić id)
Pracuję nad testami dla projektu Symfony2, a teraz szukam sposobu na tworzenie testów obejmujących obiekty encji bez utrzymywania ich. Problemem jest:ID jest polem prywatnym i nie ma do tego celu. Mogę utworzyć nowy obiekt i ustawić niektóre właściwości, ale nie mogę przetestować niczego, co by go dotyczygetId () połączenia.
$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');
$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null
Postanowienia, o których wiem:
Inicjowanie całego jądra (Symfony'sWebTestCase :: createKernel ()) i utrzymywanie podmiotówTworzenie makiety obiektu dla każdej jednostki, która zwróci prawidłowy identyfikatorHacki jak metoda statyczna wJednostka klasa zwracająca zainicjowany obiekt lub dodająca setter dlaID poleJaki jest zalecany sposób radzenia sobie z tym, jak uzyskać podmiot do testowania w czysty i szybki sposób, z ustawionym identyfikatorem?
Edytować
Okazało się, że mogę to rozwiązać z drwiną ... przepraszam, wciąż się uczę. Szukałem czystego, standardowego, a zarazem szybkiego sposobu na załatwianie spraw. Jednak zapomniałem o drugim parametrzegetMock()
- to jestNie muszę drwić z każdej metody istoty, której zamierzam użyć. Chciałem uniknąć wielu->expects()->method()->will()
itd. A to osiąga się przez dodanie:array('getId')
. Ta metoda pomocnicza rozwiązuje problem:
protected function getEntityMock($entityClass, $id)
{
$entityMock = $this->getMock($entityClass, array('getId'));
$entityMock
->expects($this->any())
->method('getId')
->will($this->returnValue($id));
return $entityMock;
}
Podczas tworzenia wielu elementów tej samej klasy, rzeczy można oczywiście uprościć bardziej metodami pomocniczymi, takimi jak ta:
protected function getTheEntityMock($id)
{
return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}
Jedynyograniczenie jest tak, że sama jednostka nie może z niej korzystaćid
tylko własnośćgetId()
rębacz.
Wszelkie cenne dane są nadal mile widziane, ale wierzę w PHPUnitgetMock()
rozwiązałem to dobrze.