2012-01-25 25 views
6

Tôi đang sử dụng phpunit để chạy các kiểm tra chức năng nhưng tôi gặp sự cố với một vài biểu mẫu. Vấn đề là phpunit không nhận thức được JS, và tôi có một biểu mẫu với một hộp chọn tự động có nhu cầu jQuery.Symfony2 Kiểm tra chức năng: Truyền dữ liệu biểu mẫu trực tiếp

Vì vậy, tôi cần phải chuyển trực tiếp dữ liệu biểu mẫu. 'Sách' đưa ra ví dụ sau:

// Directly submit a form (but using the Crawler is easier!) 
$client->request('POST', '/submit', array('name' => 'Fabien')); 

Khi tôi sử dụng ví dụ này bộ điều khiển không nhận được bất kỳ dữ liệu biểu mẫu nào. Về cơ bản, tôi thấy rằng việc truyền tên khóa 'tên' không đúng trong trường hợp của tôi khi tôi cần tên biểu mẫu là 'timesheet' trong mã của tôi. Vì vậy, tôi đã thử một cái gì đó như:

$client->request('POST', '/timesheet/create', array('timesheet[project]' => '100')); 

Nhưng điều này vẫn không hiệu quả. Trong bộ điều khiển, tôi đã cố gắng hiểu điều gì đang xảy ra và nếu bất cứ điều gì đã được nhận:

$postData = $request->request->get('timesheet'); 
$project = $postData['project']; 

Dự án không hoạt động và $ vẫn trống. Tuy nhiên, nếu tôi đã sử dụng mã sau, tôi nhận được giá trị:

$project = $request->request->get('timesheet[project]'); 

Nhưng rõ ràng đó không phải là điều tôi muốn. Atleast mặc dù tôi có thể thấy rằng có một số dữ liệu POST. Lần thử cuối cùng của tôi là thử các phương pháp sau trong phương pháp thử:

$this->crawler = $this->client->request('POST', '/timesheet/create/', array('timesheet' => array(project => '100')); 

Vì vậy, tôi đang cố chuyển mảng 'timesheet' làm phần tử đầu tiên của mảng tham số yêu cầu. Nhưng với điều này tôi nhận được lỗi:

Symfony\Component\Form\Exception\UnexpectedTypeException: Expected argument of type "array", "string" given (uncaught exception) at /mnt/hgfs/pmt/src/vendor/symfony/src/Symfony/Component/Form/Form.php line 489 

Tôi sẽ rất vui nếu có ai đó có thể mở rộng những gì trong 'cuốn sách' về cách tôi phải làm việc này.

Mẫu ràng buộc trong điều khiển:

if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      $postData = $request->request->get('timesheet'); 
      $project = $postData['project'];        

      $timesheetmanager = $this->get('wlp_pmt.timesheet_db_access'); 
      $timesheetmanager->editTimesheet($timesheet);            
      return $this->redirect($this->generateUrl('timesheet_list')); 
     } 
    } 
+0

thử cuối cùng của bạn có vẻ tốt đẹp đối với tôi. Vui lòng dán một phần bộ điều khiển của bạn vào nơi bạn liên kết biểu mẫu. Ngoài ra, bạn đã đọc chương tài liệu về kiểm tra chức năng (http://symfony.com/doc/2 chưa.0/book/testing.html # forms)? Bạn có thể thử thao tác với phần tử biểu mẫu. –

+0

Tôi đã thêm phần bộ điều khiển có liên quan ngay bây giờ. Tôi đã đọc qua chương trong cuốn sách liên quan đến kiểm tra chức năng một vài lần bây giờ tìm kiếm bất cứ điều gì tôi có thể đã bỏ qua. Khi bạn đề xuất thao tác với phần tử biểu mẫu, bạn có muốn thêm dữ liệu trong thử nghiệm chức năng vào biểu mẫu không? Điều này là không thể vì biểu mẫu có lựa chọn động được điền bằng AJAX. Vì vậy, nó có sản phẩm nào và không có gì có thể được lựa chọn, do đó tôi cần phải POST nội dung hình thức để điều khiển. – DanF7

Trả lời

0

Cố gắng sử dụng $form->bind($clientData) thay vì $form->bindRequest($request).

5

Nếu bạn đang muốn biết làm thế nào để tiêm mảng dữ liệu POST sử dụng cho khách hàng kiểm tra ...

Trong phương pháp thử nghiệm của bạn, làm một cái gì đó giống như

$crawler = $client->request('POST', '/foo', array(
    'animal_sounds' => array(
     'cow' => 'moo', 
     'duck' => 'quack' 
    ) 
); // This would encode to '/foo?animal_sounds%5Bcow%5D=moo&animal_sounds%5Bduck%5D=quack' 

$this->assertTrue(...); 

Trong bộ điều khiển, bạn sẽ truy cập params của bạn như thế này:

$data = $request->request->get('animal_sounds'); 
$cowNoise = $data['cow']; 
$duckNoise = $data['duck']; 

Hoặc bạn chỉ có thể sử dụng các hình thức API nếu phương pháp thử nghiệm được tiêm dữ liệu mẫu hợp lệ ...

+0

Nếu điều này trả lời câu hỏi của bạn, bạn có thể đánh dấu câu hỏi đó là chính xác không? Nếu nó không bạn có thể thêm một bình luận giải thích tại sao? Cảm ơn! –

+0

tôi kiểm tra nó, và nó không hoạt động. Tôi không biết tại sao. Khi tôi kiểm tra trực tiếp bằng cách sử dụng gỡ lỗi REST. Nó hoạt động: | Có vẻ như Symfony Lỗi WebTestCase: | – GusDeCooL

+0

đủ kỳ quặc, sau hàng giờ tìm kiếm, đây là Địa điểm CHỈ trên internet có thể tìm ra dứt khoát thông số thứ 3 là nơi dữ liệu bài đăng diễn ra. Cảm ơn bạn cho điều này .. Nếu ai đó có thể cung cấp một liên kết tốt hơn, nơi nó nói những gì mỗi param là sau đó im tất cả các tai. – blamb

2

bạn có thông số $request trong hành động của mình không? đó là lý do tại sao request->get() tôi hoàn toàn trống rỗng:

//WRONG 
public function projectAction() 
{ 
    $request = Request::createFromGlobals(); 
    $project = $request->request->get('timesheet[project]'); 
    //$project will be empty 
} 


//CORRECT 
public function projectAction(Request $request) 
{ 
    $project = $request->request->get('timesheet[project]'); 
    //$project is not empty 
} 

thấy How do I create a functional test which includes a POST to a page with parameters?

Các vấn đề liên quan