2017-06-27 12 views
6

Próbuję przeprowadzić test jednostkowy mojego pakietu i chcę uzyskać jednostkę pracy z Menedżera zdarzeń EventManager. Zasadniczo chcę uzyskać ostatni utrwalony obiekt. Wiem, że w normalnej aplikacji mogę zrobić to samo z EventSubscriber.Jak uzyskać UnitOfWork z EventManager Mock Object Lub jak uzyskać ostatni utrwalony obiekt w jednostce PHP?

To, co chcę osiągnąć, to sprawdzenie stanu poprzedniego utrwalonego rekordu, jeśli jego flagę oczekuje, a następnie kontynuacja, chcę go zaktualizować, aby nie była oczekująca.

Przykład:

Oto jak uzyskać Event Manager:

/** 
* @param Entity\Friend|null $friendEntity 
* @return \Doctrine\ORM\EntityManager|\PHPUnit_Framework_MockObject_MockObject 
*/ 
private function getEntityManager(Entity\Friend $friendEntity = null) 
{ 
    $repository = $this 
     ->getMockBuilder('\Doctrine\ORM\EntityRepository') 
     ->disableOriginalConstructor() 
     ->setMethods(['findBy']) 
     ->getMock(); 
    $repository 
     ->expects($this->any()) 
     ->method('findBy') 
     ->will($this->returnValue(null)); 

    /** @var \Doctrine\ORM\EntityManager|\PHPUnit_Framework_MockObject_MockObject $entityManager */ 
    $entityManager = $this 
     ->getMockBuilder('\Doctrine\ORM\EntityManager') 
     ->setMethods(['getRepository', 'getUnitOfWork', 'persist']) 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $entityManager 
     ->expects($this->any()) 
     ->method('getRepository') 
     ->will($this->returnValue($repository)); 
    $entityManager 
     ->expects($this->any()) 
     ->method('getUnitOfWork') 
     ->will($this->returnValue($repository)); 
    $entityManager 
     ->expects($this->any()) 
     ->method('persist') 
     ->with($friendEntity) 
     ->will($this->returnValue(null)); 
    return $entityManager; 
} 

I w moim teście:

/** 
* Test add friend when friend pending 
*/ 
public function testAddFriendPending() 
{ 
    $friendEntity = new Entity\Friend($this->friend, $this->user); 
    $entityManager = $this->getEntityManager($friendEntity); 
    $pendingRequest = new FriendService($entityManager); 
    /** @var Entity\Friend $lastInsert */ 
    $lastInsert = $pendingRequest->addFriend($this->friend, $this->user); 
    $lastInsert->setId(1); 
    $friendAddRequest = new FriendService($entityManager); 
    $friendAddRequest->addFriend($this->user, $this->friend); 
    $response = $friendAddRequest->getStatus(); 
    $this->assertEquals(Entity\Friend::FRIEND_ADD_STATUS_COMPLETED, $response); 
} 

EDIT

nadal pojawiają się błędy:

vendor/phpunit/phpunit/phpunit src/NalabTnahsarp/FriendFollowerBundle/Tests/Service/ 
PHPUnit 5.7.21 by Sebastian Bergmann and contributors. 

EE                 2/2 (100%) 

Time: 102 ms, Memory: 4.00MB 

There were 2 errors: 

1) NalabTnahsarp\FriendFollowerBundle\Tests\Service\FriendTest::testAddFriendNotPending 
Error: Call to a member function getUnitOfWork() on null 

/Users/Sites/app/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:194 
/Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Service/Friend.php:140 
/Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Service/Friend.php:63 
/Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Tests/Service/FriendTest.php:43 

2) NalabTnahsarp\FriendFollowerBundle\Tests\Service\FriendTest::testAddFriendPending 
Error: Call to a member function getUnitOfWork() on null 

/Users/Sites/app/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:194 
/Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Service/Friend.php:140 
/Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Service/Friend.php:63 
/Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Tests/Service/FriendTest.php:57 
+1

Nie kpić z kodu osoby trzeciej. Zostało to już wyjaśnione już tysiące razy. Na przykład tutaj: https://stackoverflow.com/a/29471209/330267 Technologia może być inna, ale obowiązują te same zasady. –

+0

@JakubZalas, więc masz na myśli, że nie powinienem zrobić testu jednostkowego, zamiast zrobić test funkcjonalny? Chciałbym mieć w pamięci sprawdzanie kodu, zamiast angażowania testowej bazy danych. ** Ponieważ ta biblioteka chce się dzielić ze społecznością i nie oczekuję od nich zainstalowania bazy danych do przeprowadzenia testów. ** – Gaurav

Odpowiedz

0

Spróbuj dodać kolejny oczekiwany sposób wykorzystać tę funkcję tak:

$configurationMock = $this 
     ->getMockBuilder('\Doctrine\ORM\Mapping\EntityListenerResolver') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $entityManager 
     ->expects($this->any()) 
     ->method('getConfiguration') 
     ->will($this->returnValue($configurationMock)); 
+0

Testy \ Usługa \ Friend \ Test :: testAddFriendPending BadMethodCallException: Niezdefiniowana metoda 'getEntityListenerResolver'. Nazwa metody musi zaczynać się od findBy lub findOneBy! /Users/Sites/app/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:226 /Users/Sites/app/vendor/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker. php: 59 /Users/Sites/app/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:305 – Gaurav

+0

Nie działa. ** BadMethodCallException **. – Gaurav

+0

zaktualizuj odpowiedź spróbuj teraz, ale myślę, że dostaniesz więcej fałszywek –

2

Przypuszczam chcesz sprawdzić, czy Trwały jednostka ma pewne specyficzne wartości ustawione i oczywiście jest odpowiedni rodzaj.

Należy dodać to do sposobu utrzymywać się przez kierownika jednostki tak:

Jeśli utrzymują się() jest wywoływana tylko raz masz to łatwe:

$entityManager 
    ->expects($this->once()) 
    ->method('persist') 
    ->with($theEntityYouExpectWithAllValues) 
    ->will($this->returnValue(null)); 

Z bardziej wyrafinowanych oczekiwań:

$entityManager 
    ->expects($this->once()) 
    ->method('persist') 
    ->willReturnCallback(function($entityToTest){ 
     $this->assertInstanceOf(EntityClass::class, $entityToTest); 
     $this->assertEquals('some_value', $entityToTest->someKey); 
    }); 

Jeśli nie jest to tylko wezwanie do utrwalania() w testowanym kodzie musisz użyć $ this-> w() zamiast raz():

$entityManager 
    ->expects($this->at(3)) // 3rd call of any method on manager not just persist 
    ->method('persist') 
    // ... 
+0

Nie jestem pewien, jak mogę to zrobić. Czy mógłbyś mi pomóc? Oto link do mojego repozytorium. https: // github.com/gaurav-Garry/przyjaciel-follower-bundle – Gaurav

+0

nadal otrzymywać następujące błędy: Były 2 błędy: 1) NalabTnahsarp \ FriendFollowerBundle \ Tests \ Służby \ FriendTest :: testAddFriendNotPending Error: Zadzwoń do getUnitOfWork funkcji członka() na wartość null /Users/Sites/app/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:194 /Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Service/Friend.php: 140 /Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Service/Friend.php:63 /Users/Sites/app/src/NalabTnahsarp/FriendFollowerBundle/Tests/Service/FriendTest.php:43 – Gaurav

+0

@Gaurav: Z to nie potrzebujesz już funkcji getLastPersistedEntity(). Ta metoda powoduje błąd. Nie nazywaj tego, moja propozycja już wykonuje kontrole do pożądanego podmiotu. – colburton

Powiązane problemy