2012-02-27 23 views
9

Tôi nhận được "InvalidArgumentException: Danh sách nút hiện tại trống." chạy thử nghiệm chức năng thông qua PHPUnit. Đây là thử nghiệm tôi đã viết:Kiểm tra chức năng Symfony2 InvalidArgumentException: Danh sách nút hiện tại trống

public function testAdd() 
{ 
    $client = static::createClientWithAuthentication('main'); 

    $crawler = $client->request('GET', 'en/manage'); 

    $send_button = $crawler->selectButton('submit'); 

    $form = $send_button->form(array(
     'PrCompany[email]' => '[email protected]', 
     'PrCompany[first_name]' => 'Anton', 
     'PrCompany[last_name]' => 'Tverdiuh', 
     'PrCompany[timezone]' => 'Europe/Amsterdam' 
    )); 

    $form['PrCompany[companies][1]']->tick(); 

    $client->submit($form); 


    $this->assertTrue($crawler->filter('html:contains("User is invited")')->count() > 0); 

} 
+0

Tôi nghĩ rằng tôi có một câu hỏi tương tự có thể giúp bạn hiểu vấn đề của mình nhiều hơn. Chưa có câu trả lời nào ... http://stackoverflow.com/questions/9662697/symfony2-functional-testing-crawler-not-working – Matt

+0

Bạn chưa đánh dấu câu hỏi nào là câu trả lời, vì vậy tôi sẽ thêm câu trả lời của riêng mình, hy vọng question –

+0

Tôi nghĩ bạn cần sử dụng '$ form ['PrCompany [companies]'] [1] -> tick(); '(với [1] bên ngoài dấu ngoặc kép) – caponica

Trả lời

11

Bạn có thể gỡ rối vấn đề bằng cách sử dụng var_dump($client->getResponse()->getContent());

Bên cạnh đó, tôi nghĩ bạn nên viết này:

$crawler = $client->submit($form); 

Nếu không, bạn sẽ được thử nghiệm phản ứng của url đầu tiên, trước khi gửi biểu mẫu.

0

Bạn có thể thử sử dụng Codeception với mô-đun Symfony2. Nó cung cấp giao diện linh hoạt cho các thử nghiệm chức năng của Symfony2 và có các tính năng gỡ lỗi tốt hơn.

2

Là một theo dõi những gì @ greg0ire viết, hãy kiểm tra xem nếu

var_dump($client->getResponse()->getContent()); 

Trả về một trang chuyển hướng thay vì nội dung thực tế. Nếu có, bạn có thể thêm điều này:

$client->followRedirects(true); 
5

Tôi cũng đang đấu tranh với điều này và có vẻ như phương pháp selectButton đã kích hoạt lỗi này.

Sau khi đọc lên trên DOM Crawler docs Tôi thấy rằng phương thức selectButton lấy văn bản nút thực tế làm đối số chuỗi. Vì vậy, nếu nút của bạn là 'gửi mẫu của tôi xin vui lòng', đó sẽ là văn bản của bạn.

Nó không mất thông số khác nhau quá, như hình dưới đây (lấy từ các tài liệu)

A selectButton() method is available on the Crawler which returns another 
Crawler that matches a button (input[type=submit], input[type=image], 
or a button) with the given text. 

EDIT

Sau cuối cùng hoàn thành xuất sắc bài kiểm tra tôi cũng khuyên bạn nên bạn làm theo ví dụ này để thử nghiệm biểu mẫu:

use Goutte\Client; 

$client = new Client(); 
$crawler = $client->request('GET', 'https://github.com/login'); 

$form = $crawler->selectButton('Log in')->form(); 
$form['login'] = 'symfonyfan'; 
$form['password'] = 'anypass'; 

$crawler = $client->submit($form); 
$this->assertTrue($crawler->filter('html:contains("Welcome Back")')->count() > 0); 

Sự khác biệt chính là, tôi đã sử dụng t ông Goutte bó, mà tôi cài đặt với nhà soạn nhạc từ the packagist (trong trường hợp của tôi, tôi thêm "fabpot/goutte": "1.0.*@dev")

+0

Tôi nghĩ rằng toàn bộ ý tưởng sử dụng thử nghiệm tích hợp là không cần thư viện bổ sung. Giới thiệu Goutte có vẻ như quá mức cần thiết khi bạn có thể làm điều đó với các công cụ tích hợp – skoop

+0

@Andrew Atkinson là Goutte cần thiết để thử nghiệm các biểu mẫu? Tôi luôn gặp lỗi 'trường không thể truy cập', khi làm theo các hướng dẫn chuẩn – Aris

+0

@skoop Trong trường hợp của tôi, tôi đang sử dụng Goutte và hoạt động tốt. –

0

Lỗi này có thể xảy ra khi bánh xích không thể tìm thấy yếu tố hình thức yêu cầu; Khá khó khăn khi bạn đang sử dụng, ví dụ, hình thức xây dựng như khi chạy, nó sẽ tạo ra tên đầu vào khác nhau:

$form = $this-> createFormBuilder($store) 
      ->add('storeNumber','text') 
      ->add('storeName','text') 
      ->add('save', 'submit') 
      ->getForm(); 

chí tên trường đầu ra như:

form_storeNumber 

mà nên được sử dụng trong lớp thử nghiệm :

$form=$crawler->selectButton('save')->form(); 
$form['form_storeNumber']='10'; 
1

Tôi thấy câu hỏi vẫn chưa có câu trả lời. Tôi đã từng gặp vấn đề tương tự.

Trong trường hợp goutte của tôi không thể thực hiện yêu cầu này vì tên đầu vào bị thay đổi bởi javascript khi đang di chuyển.

Khi goutte nhận được html, nó thấy một biểu mẫu. Và khi gửi với các tham số được điền trước, các thành phần đầu vào biểu mẫu không thể khớp với $form->setValues($params) do đó \ InvalidArgumentException đã bị ném.

Được giải quyết bằng cách thực hiện yêu cầu bằng tay.

// $form->setValues($data); 
// $this->getGoutte()->submit($form); 

$data = array(
    'input_name[key]' => 'value' 
); 
$this->getGoutte()->request($form->getMethod(), $form->getUri(), $params); 
0

Tôi gặp vấn đề tương tự với ứng dụng Silex. Tôi đang tìm kiếm

$buttonCrawler = $crawler->selectButton('input[type="submit"]'); 

Thay vào đó, cách chính xác để làm điều đó là cung cấp cho các giá trị của nút

$buttonCrawler = $crawler->selectButton('value_of_the_button'); 


Ví dụ, trong trang của bạn:

<form> 
    ... 
    <input type="submit" value="Click Me"> 
</form> 


Và trong các thử nghiệm của bạn:

$buttonCrawler = $crawler->selectButton('Click Me'); 
$form = $buttonCrawler->form(); 
... 
Các vấn đề liên quan