2017-02-15 55 views
1

我目前正在为我的Symfony控制器编写一些测试。我在其中使用了Doctrine param转换器,并且我无法找到在我的测试套件中嘲笑它的方法!测试Symfony控制器时模拟教条param转换器

我的控制器看起来像:

/** 
* @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查询执行的事实在一个空的测试数据库上。我知道我可以使用灯具,我使用它,并且仍然将它用于我的存储库测试,但是我想避免在此情况下使用它。

如果有一种方法来模拟这个转换器,我很乐意听到它!

感谢社区!

回答

2

你可以模拟负责在数据库中搜索这些信息的参数转换。因此,您可以创建一个模拟服务,负责在数据库中搜索对象,该对象位于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

对于原因,我不知道,当我嘲笑这个类中, param转换器经理挑选另一个。所以这个模拟是无效的!但是,当嘲讽参数转换器管理器本身时,它的工作方式就像预期的那样,您只需注册一个回调,它将自己填充请求属性中的数据!我将把最终代码放在我的问题中作为编辑,但我给你正确的答案:D!谢谢 :) ! – Kern

+1

对不起,我知道这是一个老问题,但我没有看到这个方法的实现$ this-> getMembershipRequestManagerMock()。我有问题嘲笑一个参数转换器,我会很感激,如果你可以发布这个方法的实现。谢谢 – Armando