2017-02-15 10 views
1

В настоящее время я пишу несколько тестов для своих контроллеров Symfony. Я использую в нем конвертер параметров Doctrine, и я не могу найти способ издеваться над ним в своем тестовом наборе!Mock doctrine param converter при тестировании контроллера Symfony

Мой контроллер выглядит следующим образом:

/** 
* @Security("has_role('ROLE_USER')") 
* @Route("/troops/{troop_id}/membership-requests/{id}/accept", name="accept_membership_request", methods={"POST"}) 
* @param \AppBundle\Controller\MembershipRequest $membershipRequest 
*/ 
public function acceptMembershipRequest(MembershipRequest $membershipRequest) { 
    $troop = $membershipRequest->getTroop(); 
    if($this->get('kilix_abac.security')->enforce('troop_leadership', $this->getUser(), $troop) !== true) { 
     throw new AccessDeniedHttpException('troops.access_denied'); 
    } 
    $this->get('medievistes.troop.membership_request_manager')->acceptMembershipRequest($membershipRequest); 
    return new JsonResponse([ 
     'redirection_url' => $this->generateUrl('troop_dashboard', ['id' => $membershipRequest->getTroop()->getId()]) 
    ]); 
} 

Соответствующий метод испытаний

public function testAcceptMembershipRequest() { 
    $client = $this->createLoggedClient(); 
    $client->getContainer()->set('medievistes.troop.membership_request_manager', $this->getMembershipRequestManagerMock()); 
    $client->getContainer()->set('kilix_abac.security', $this->getKilixAbacMock()); 
    $client->request('POST', '/troops/1/membership-requests/1/accept'); 

    $this->assertEquals(200, $client->getResponse()->getStatusCode()); 
    $this->assertJson($client->getResponse()->getContent()); 
    $this->assertArrayHasKey('redirection_url', json_decode($client->getResponse()->getContent(), true)); 
} 

я, очевидно, получить ответ 404 вместо ожидаемого 200, в связи с тем, что запрос SQL выполняется в пустой тестовой базе данных. Я знаю, что я могу использовать приборы, я использовал его, и я все еще использую его для своих тестов репозитория, но я бы хотел избежать использования этого в этом контексте.

Если есть способ издеваться над этим конвертером, я был бы рад услышать об этом!

Thanks community!

ответ

2

Вы можете высмеять преобразование param, которое отвечает за поиск этой информации в базе данных. Таким образом, вы можете создать макет службы, отвечающей за поиск объектов в базе данных, которая находится под sensio_framework_extra.converter.doctrine.orm. Или вы можете просто изменить значение параметра класса для вашего имени класса.

sensio_framework_extra.converter.doctrine.class 

Конечно, это должно, прежде чем отправлять запрос таким же образом, как вы делаете для request_membership_manager и безопасности:

$client->getContainer()->set(
    'sensio_framework_extra.converter.doctrine.orm', 
    $this->getDoctrineConvertMock() 
); 
+0

По причине я не знаю, когда я высмеивать этот класс, то менеджер преобразователя параметров выбирает другой. Таким образом, макет неэффективен! Но когда высмеивается сам менеджер преобразователя параметров, он работает так, как предполагалось, вам просто нужно зарегистрировать обратный вызов, который сам заполнит данные в атрибутах запроса! Я поставлю окончательный код в своем вопросе как редактирование, но я даю вам правильный ответ: D! Спасибо вам :) ! – Kern

+1

Прошу прощения, я знаю, что это немного старый вопрос, но я не вижу реализации этого метода $ this-> getMembershipRequestManagerMock(). У меня возникают проблемы с издевательским преобразованием параметров, и я буду признателен, если вы опубликуете реализацию этого метода. благодаря – Armando