2016-09-05 22 views
7

Tôi chỉ mới bắt đầu sử dụng PHPUnit với Zend và cần ít sự trợ giúp để tìm ra cách các bài kiểm tra này hoạt động như thế nào.Zend 2: Bài kiểm tra đơn vị cho lớp mẫu

Tôi muốn kiểm tra xem biểu mẫu có trả về bất kỳ thông báo lỗi nào không nếu tôi không chuyển bất kỳ thông số POST nào.

Vấn đề là một lĩnh vực từ hình thức của tôi đang sử dụng lỗi DoctrineModule\Form\Element\ObjectSelect

... 
    $this->add(array(
     'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
     'name' => 'user', 
     'attributes' => array(
      'id' => 'user-label', 
     ), 
     'options' => array(
      'object_manager' => $em, 
      'target_class' => 'Application\Entity\User', 
      'property' => 'username', 
      'label' => 'User:', 
      'display_empty_item' => true, 
      'empty_item_label' => '---', 
      'label_generator' => function($entity) { 
       return $entity->getUsername(); 
      }, 
     ), 
    )); 
    ... 

tôi nhận được sau Học thuyết của:
Fatal error: Call to a member function getIdentifierFieldNames() on null

Tôi cố gắng ghi đè lĩnh vực này với đối tượng chế giễu, tuy nhiên Zend doesn' t cho phép objects trong type, chỉ cần tên lớp (string), vì vậy mã này không hoạt động:

public function testIfFormIsValid() 
{ 
    $objectSelect = $this->getMockBuilder('DoctrineModule\Form\Element\ObjectSelect') 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $objectSelect->expects($this->any()) 
     ->method('getValueOptions') 
     ->will($this->returnValue(array())); 

    $form = new \AppModuleComment\Form\Comment('form', array(
     'em' => $this->em // Mocked object 
    )); 
    $form->add(array(
     'type' => $objectSelect, 
     'name' => 'user', 
     'attributes' => array(
      'id' => 'user-label', 
     ), 
     'options' => array(
      'object_manager' => $this->em, 
      'target_class' => 'Application\Entity\User', 
      'property' => 'username', 
      'label' => 'User:', 
      'display_empty_item' => true, 
      'empty_item_label' => '---', 
      'label_generator' => function($entity) { 
       return $entity->getUsername(); 
      }, 
     ), 
    )); 

    $data = array(
     'id' => null, 
     'user' => null 
    ); 

    $form->setData($data); 
    $this->assertTrue($form->isValid(), 'Form is not valid'); 
}  

Tôi đang làm gì sai? Tôi nên kiểm tra mã như thế nào?

Trả lời

1

Có vẻ như bạn đang thử nghiệm chức năng của Zend hoặc Doctrine (hoặc cả hai) chứ không phải mã của riêng bạn. Khi bạn sử dụng thư viện, bạn nên tin tưởng các thư viện này.

Điều gì xảy ra là: Form\Form::add() sử dụng Form\Factory::create() để tạo từ mảng thành phần. Form\Factory::create() sử dụng Form\FormElementManager::get() để lấy phần tử từ loại đã cho.

Loại của bạn là một đối tượng và vì Form\FormElementManager::get() không thể xử lý các đối tượng tập lệnh của bạn sẽ không thành công.

Dường như bạn muốn kiểm tra xem bài đăng có trống không Form::valid() gọi ObjectSelect::valid() nhưng điều này không xác minh nếu giá trị là rỗng. Đó là mã từ Doctrine/Zend không phải của bạn. Đừng kiểm tra nó.

Thú vị hơn khi bạn muốn thử kết quả của một lựa chọn từ trong Doctrines ObjectSelect. Nhưng đó là một câu hỏi khác.

+0

Vì vậy .. làm cách nào tôi nên kiểm tra Nếu biểu mẫu trả về thông báo xác thực nếu ai đó gửi biểu mẫu trống? Hoặc nếu biểu mẫu hợp lệ nếu người dùng cung cấp dữ liệu chính xác? Tôi cần chức năng của Doctrine để kiểm tra điều này – user1409508

+1

Có vẻ như bạn cần thực hành nhiều hơn để viết các bài kiểm tra đơn vị. Trước hết: bạn không viết mã bên trong bài kiểm tra đơn vị của mình - thay vào đó bạn chạy mã của mình. Tôi khuyên bạn nên chơi với các đơn vị dễ dàng hơn trước khi thử kiểm tra các bộ điều khiển tạo biểu mẫu sử dụng các trình quản lý thực thể. Bạn nên chắc chắn đơn vị của bạn là gì mà bạn muốn kiểm tra và nếu bạn muốn sử dụng thử nghiệm tăng gấp đôi hoặc có một số liệu cố định và như vậy. – iRaS

+0

Có lẽ bạn đúng Tôi cần thực hành nhiều hơn để viết bài kiểm tra. Nhưng bạn đã không giải thích làm thế nào tôi nên kiểm tra các hình thức và inputFilters kết nối với Doctrine. Tôi muốn kiểm tra xem tôi có nhận được thông báo xác thực khi người dùng gửi biểu mẫu trống hoặc anh bỏ qua một số đầu vào. Lý do tôi viết mã trong các bài kiểm tra của tôi là tôi muốn hiển thị những gì tôi đã cố gắng để làm cho nó hoạt động với Doctrine – user1409508

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