2015-01-19 4 views
3

액션이없는 폼이 있고 (자바 스크립트와 함께 제출됩니다) 컨트롤에 대한 유닛 테스트를 작성하려고하지만 "action"속성이 없어서 실패합니다 :symfony 유닛 테스트 : 폼 액션 추가/수정

InvalidArgumentException : 현재 URI는 절대 URL ("")이어야합니다.

단위 테스트에 추가하거나 크롤러를 사용하여 HTML 콘텐츠를 수정하는 방법이 있습니까?

<form id="form_search_page"> 
    <input type="text" name="keyword" value="" /> 
    <button type="submit" name="searchBtn" id="searchBtn">Search</button> 
</form> 


$client = $this->makeClient(true); 
$url = $this->createRoute("page_index")); 
$crawler = $client->request('GET', $url); 
$response = $client->getResponse(); 

$form = $crawler->filter('#form_search_page')->form(); 
$params = array(
    "form[text]" => "dummy title" 
); 
$form->setValues($params); 
$crawler = $client->submit($form); 
$response = $client->getResponse(); 
$this->assertGreaterThan(0, $crawler->filter('.pages li')->count()); 

답변

3

을 나는 해결책을 발견 :

$crawler 
    ->filter('form#form_search_page') 
    ->reduce(function (Crawler $form) use ($router) { 
     $url = $router->generate('search_page', array(), true); 

     $node = $form->getNode(0); 
     if (!$node->hasAttribute('action')){ 
      $node->setAttribute('action', $url); 
      $node->setAttribute('method', 'POST'); 
      return true; 
     } 
     return false; 
    }) 
    ->first(); 
2

당신은 아약스 POST 양식의 (a CSRF 토큰 형태를 가정) 위의 예로서 제출 테스트 수 :

$crawler = $this->client->request('GET', $url); 

// retrieves the form token 
$token = $crawler->filter('[name="myform[_token]"]')->attr("value"); 

$posturl = $this->client->getContainer()->get('router')->generate("the-url-of-the-submit"); 
// makes the POST request 
$crawler = $this->client->request('POST', $posturl, array(
    'myform' => array(
     '_token' => $token 
    )), 
    array(), 
    array(
     'HTTP_X-Requested-With' => 'XMLHttpRequest', 
    ) 
); 

$this->assertTrue(
    $this->client->getResponse()->headers->contains(
     'Content-Type', 
     'application/json' 
    ) 
); 

희망이 도움

+1

의견을 보내 주셔서 감사합니다. 내 첫 번째 아이디어 다음으로 크롤러를 사용하여 HTML을 수정했습니다. –

+0

안녕하세요. @CristianBujoreanu 이 답변이나 질문에 대한 답변이 있으면 [확인] (http://meta.stackexchange.com/q/5234/179419) 및/또는 upvote를 체크 표시를하여주십시오. 이는 해결책을 찾았으며 응답자와 자신에게 어느 정도의 평판을 제공한다는 것을 더 넓은 커뮤니티에 나타냅니다. 이를 수행 할 의무는 없습니다. – Matteo

관련 문제