2012-03-16 44 views
8

Tôi bắt đầu viết bài kiểm tra đơn vị Doctrine 2 Mongo ODM nhưng nhận ra rằng tôi không có một chiến lược tốt trong mã của tôi để làm điều này. Tôi muốn chạy các bài kiểm tra và thực sự tồn tại các đối tượng nhưng sau đó tôi muốn cho phép dữ liệu thử nghiệm của tôi được dễ dàng loại bỏ trong tearDown. Tên bộ sưu tập và DB phải được chỉ định từ những gì tôi đã thấy trong các chú thích và không thể ghi đè vì vậy tôi không thể chỉ tạo một DB thử nghiệm và xóa nó sau này.Đơn vị kiểm tra học thuyết ODM

Có ai có thực hành hay ví dụ hay nhất về những gì họ nghĩ là cách tốt nhất để kiểm tra không?

+0

Bất kỳ con trỏ để thực hành tốt nhất cho làm thế nào tôi nên thử nghiệm các mô hình đó được tiếp tục tồn bởi Học thuyết ODM sẽ được đánh giá cao. Dường như không có nhiều thứ để mô hình sau đó. –

Trả lời

10

Bạn không phải tiếp tục tồn tại các đối tượng của mình. Cách tốt là sử dụng mô phỏng để kiểm tra xem đối tượng của bạn có được tiếp tục không. Tôi sẽ cho bạn một số ví dụ. Giả sử bạn có một lớp học:

class SomeSerivce 
{ 
    private $dm; 

    public function __construct(DocumentManager $dm) 
    { 
     $this->dm = $dm; 
    } 

    public function doSomeMagic($someDocument, $someValue) 
    { 
     $someDocument->setSomeValue($someValue); 
     $this->dm->persist($someDocument); 
     $this->dm->flush(); 
    } 
} 

Bây giờ, bạn sẽ không kiểm tra xem liệu tài liệu có thực sự tồn tại vì điều này được kiểm tra ở đâu đó id Mã giáo lý hay không. Bạn có thể giả định rằng các phương thức persistflush hoạt động tốt. Điều bạn muốn kiểm tra là mã của bạn có gọi chính xác các phương thức này hay không.

Vì vậy, thử nghiệm của bạn có thể trông giống như:

(...) 
public function testDoSomeMagic() 
{ 
    $documment = new Document(); 

    // preapre expected object 
    $expectedValue = 123; 
    $expectedDocument = new Document(); 
    $expectedDocument->setValue($expectedValue); 

    // prepare mock 
    $dmMock = $this->getMockBuilder('DocumentManager') 
     ->setMethods(array('persist', 'flush')) 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $dmMock->expects($this->once()) 
     ->method('persist'); 
     ->with($this->equalTo($expectedDocument)); 
    $dmMock->expects($this->once()) 
     ->method('flush'); 

    // new we start testing with the mock 
    $someService = new SomeService($dmMock); 
    $someService->doSomeMagic($document, $expectedValue); 
} 
+1

Nó trở nên phức tạp hơn nhiều khi bạn bắt đầu thêm vào queryBuilder. Gợi ý? –