2017-02-15 80 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