测试Symfony控制器时模拟学说param转换器

时间:2017-02-15 23:11:34

标签: doctrine-orm phpunit symfony

我目前正在为我的Symfony控制器编写一些测试。我在其中使用了Doctrine 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));
}

由于在空测试数据库上执行SQL查询,我显然得到404响应而不是预期的200响应。我知道我可以使用fixtures,我使用它,我仍然将它用于我的存储库测试,但我想避免在这种情况下使用它。

如果有办法嘲笑这个转换器,我很高兴听到它!

感谢社区!

1 个答案:

答案 0 :(得分:2)

您可以模拟负责在数据库中搜索这些信息的param转换器。因此,您可以创建一个模拟服务,负责搜索位于sensio_framework_extra.converter.doctrine.orm下的数据库中的对象。或者您只需更改类名的类参数值。

sensio_framework_extra.converter.doctrine.class 

当然,这应该在您发布请求之前,就像您对request_membership_manager和security一样:

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