Как мы смоделируем контроллер api symfony rest с репозиторием в его параметрах, который сам имеет ManagerRegistry в своем конструкторе - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь выполнить функциональное тестирование для моего контроллера API в symfony 3.4, но у меня возникают проблемы, поскольку у меня есть такой репозиторий.

class AdminRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Admin::class);
    }
}

На самом деле, так как я внес эти изменения,Я решил добавить свои репозитории в мой контроллер следующим образом.

public function getMyReservationAction(Request $request, AdminRepository $adminRepos, ReservationRepository $reservationRepos)
{
    $values = json_decode($request->getContent(), true);

    return $this->verifValid(
            Header::getToken($request)
            , $values['reservation_id']
            , $adminRepos
            , $reservationRepos
    );
}

Проблема в том, что я передаю свой AdminRepository в метод verifyValid, используя $ adminRepos для вызова базы данных.и я хотел бы проверить мой контроллер, поэтому решил смоделировать репозиторий следующим образом.

public function testGetMyReservationAction() {

    $token = $this->createUser(true,'ROLE_USER');


    $admin = new Admin();
    $admin->setEmail('test@test.com');

    // Now, mock the repository so it returns the mock of the admin
    $adminRepos = $this->getMockBuilder(AdminRepository::class)
        ->disableOriginalConstructor()
        ->getMock();
    $adminRepos->expects($this->any())
        ->method('findBy')
        ->willReturn(Array($admin));

    $entityManager = $this
        ->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry')
        ->disableOriginalConstructor()
        ->setMethods(['getRepository', 'clear'])
        ->getMock();

    $entityManager
        ->expects($this->once())
        ->method('getRepository')
        ->with(Admin::class)
        ->will($this->returnValue($adminRepos));

    $this->client->getContainer()->set('doctrine.orm.default_entity_manager', $entityManager);

    // Set the client
    $this->client->getContainer()->set('doctrine', $entityManager);

    //Initialisation des paramètres
    $params = [
        'token' => $token
        , 'reservation_id' => $this->getReservation()->getId()
    ];


    //On appelle la route
    $this->client->request('POST', '/auth/reservation/getone'
        , array() , array()
        , array('HTTP_AUTHORIZATION' => 'Bearer '. $token)
        , json_encode($params)
    );

    //On vérifie que le code de retour est bien 200
    $this->assertEquals(200 , $this->client->getResponse()->getStatusCode());
}

но он говорит мне, что мне нужно создать экземпляр моего ManagerRegistry ..

  PHP Fatal error:  Class Mock_ManagerRegistry_90efed4b contains 11 abstract methods and must therefore be declared abstract or implement the remaining
 methods (Doctrine\Common\Persistence\ManagerRegistry::getDefaultManagerName, Doctrine\Common\Persistence\ManagerRegistry::getManager, Doctrine\Common
\Persistence\ManagerRegistry::getManagers, ...) in phar:///usr/local
/bin/phpunit/phpunit-mock-objects/Generator.php(263) : eval()'d code on line 1

Я не думаю,это нужно сделать, поэтому я думаю, что я делаю что-то не так, но я не знаю, где.

Не могли бы вы помочь мне, пожалуйста?Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...