我目前正在为我的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,我使用它,我仍然将它用于我的存储库测试,但我想避免在这种情况下使用它。
如果有办法嘲笑这个转换器,我很高兴听到它!
感谢社区!
答案 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()
);