2013-01-22 26 views
7

Có cách nào để kiểm tra đơn vị đúng mô hình Doctrine trong ứng dụng Symfony 2 không? Ngay bây giờ tôi đang viết các bài kiểm tra chức năng đi qua bộ điều khiển để đảm bảo rằng ứng dụng của tôi đang lưu trữ dữ liệu (và CRUDing) đúng cách. Nhưng điều đó phải mất quá lâu và nó rất xấu, vì tôi phải thiết lập đồ đạc cho mỗi bộ, và xóa cơ sở dữ liệu sau khi bộ hoàn thành.Symfony 2: làm thế nào để kiểm tra đúng mô hình Doctrine?

Làm cách nào để tách biệt các thử nghiệm đơn vị Entity và EntityRepository? Có hướng dẫn nào về điều này không?

+0

Look trong thư mục học thuyết orm, có một TestSuite đầy ... kiểm tra. – mpm

+0

Đó là các bài kiểm tra đơn vị theo định hướng Doctrine, với abstractTestSuites cho Doctrine, không phải ứng dụng của tôi. Tôi đang tìm kiếm một cách đơn giản và thích hợp của đơn vị kiểm tra các mô hình của riêng tôi trong Gói của tôi. – vinnylinux

Trả lời

0

Bí quyết mà tôi thấy hữu ích khi thử nghiệm đơn vị là sử dụng cơ sở dữ liệu dựa trên tệp của sqlite. Bạn có thể tạo các bảng cơ sở dữ liệu rỗng trong một tệp có tên 'emptydatabase.dat' và sử dụng sqlite để tải nó. Bây giờ vào cuối thử nghiệm, bạn có thể ghi đè lên tệp cơ sở dữ liệu rỗng và bắt đầu với một cơ sở dữ liệu mới.

Bạn có thể tạo các file schema trống với mã này:

 $classes = array(
      $em->getClassMetadata('MyAPIBundle:Currency'), 
      $em->getClassMetadata('MyAPIBundle:Permission'), 
      $em->getClassMetadata('MyAPIBundle:Role'), 
      $em->getClassMetadata('MyAPIBundle:User'), 
     ); 

     $tool = new \Doctrine\ORM\Tools\SchemaTool($em); 
     $tool->createSchema($classes); 
     rename($schemafile, dirname(__FILE__) . '/../Data/schema.dat'); 

     print "Schema file was regenerated\n"; 

Cũng

Chúng tôi cũng tạo ra một dịch vụ cho tất cả các tổ chức lớn mà yêu cầu hoạt động, và dễ dàng kiểm tra rằng đứng dịch vụ một mình trên nó sở hữu. Lúc đầu, chúng tôi đã có mọi thứ trong Kho lưu trữ nhưng điều đó không có ý nghĩa, nhưng bằng cách di chuyển chúng sang Dịch vụ và chế nhạo tất cả các đối tượng phụ thuộc đã làm việc tốt hơn

+0

Đây không phải là hoàn toàn bị cô lập, vì bạn phải thiết lập đồ đạc và rõ ràng các bước của bạn. – vinnylinux

+0

Bạn phải thiết lập đồ đạc anyways cho mỗi lần bạn muốn chạy thử nghiệm. Bạn cũng có thể sử dụng phiên bản trong bộ nhớ của sqlite mà có thể làm việc tốt hơn cho bạn. Lý do tôi phải đi với tập tin dựa trên là tôi đã được giao dịch với một sql sharded và mọi lúc tôi chuyển sang một databae khác nhau tôi sẽ mất dữ liệu trong bộ nhớ của tôi. –

1

Chúng tôi đã thiết lập một singleton gọi là TestManager một DB thử nghiệm trống một lần cho tất cả các thử nghiệm. Sau đó, chúng tôi cắt bớt các bảng quan trọng cho một thử nghiệm trong phương thức setUp() và thiết lập các đồ đạc trong PHP bằng cách sử dụng API doctrine. Chúng tôi sử dụng MySql cho việc này.

Điều này cho chúng ta sự chậm trễ ~ 10 giây cho mỗi lần bắt đầu của phpunit, nhưng điều này là độc lập với số lượng bài kiểm tra. Tôi nghĩ rằng điều này có thể được thay thế rất nhiều bằng cách sử dụng phiên bản trong bộ nhớ của sqlite.

Cá nhân tôi đã học được rất nhiều về việc thiết lập kiểm tra chức năng với symfony2/học thuyết bằng cách xem mã của Johann Schmitt's functional test for the payment core bundle.

Và chỉ để làm rõ mọi thứ: Nếu bạn muốn có bài kiểm tra đơn vị thuần túy, bạn phải học toàn bộ giáo lý. Mọi thứ khác là một thử nghiệm chức năng/tích hợp. Nhưng thường thì sự phân tán này khá là học thuật và nó chỉ là công việc nhiều để chế nhạo học thuyết.

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