2012-02-21 27 views
6

Khi sử dụng PHPUnit để kiểm tra một lớp dựa trên cơ sở dữ liệu, phương thức getDataSet() cung cấp dữ liệu để làm thử nghiệm cho toàn bộ bộ kiểm thử. Điều đó thật tuyệt vời, nhưng làm cách nào để cung cấp dữ liệu cho một thử nghiệm cụ thể? Nó không phải là bất thường, đặc biệt là khi sử dụng các tập dữ liệu thu nhỏ, cho mỗi bài kiểm tra yêu cầu dữ liệu cơ sở dữ liệu khác nhau trên đầu trang của dữ liệu chung mà tất cả các bài kiểm tra sử dụng. Tôi biết đối tượng PDO có sẵn, và trong trường hợp của chúng ta, đối tượng DB nguyên gốc của ứng dụng cũng có sẵn (có nghĩa là chúng ta có thể chạy các truy vấn thô hoặc sử dụng các chức năng khác trong ứng dụng), nhưng sẽ tốt hơn nếu có cách chèn dữ liệu điều đó thúc đẩy các container DataSet của PHPUnit để tất cả các dữ liệu thử nghiệm được xử lý trong cùng một thời trang để cải thiện sự rõ ràng và bảo trì dễ dàng hơn.Cách chèn hàng cơ sở dữ liệu cụ thể cho từng trường hợp bằng PHPUnit

Có cách nào để thực hiện việc này không?

Trả lời

4

đó là một câu trả lời cuối nhưng nó vẫn có thể có ích cho một số người mà tôi đoán ...

Bạn có thể thực hiện việc này bằng cách gọi phương thức execute của số IDatabaseOperation mà bạn có thể nhận được từ PHPUnit_Extensions_Database_Operation_Factory. Về cơ bản, bạn có thể sử dụng CLEAN_INSERT hoặc INSERT.

zerkms' second approach, bạn sẽ gọi nó ở đầu mỗi thử nghiệm cần dữ liệu cụ thể. Ví dụ:

public function testA() { 
    PHPUnit_Extensions_Database_Operation_Factory::INSERT() 
    ->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml')); 

    // Test code 
} 

Tuy nhiên, lợi thế của giải pháp này là các bộ dữ liệu của vụ án kiểm tra toàn bộ vẫn không thay đổi, vì vậy:

  • Phương pháp thử vẫn độc lập lẫn nhau (trong khi trong cách tiếp cận của zerkms, nếu bạn không/quên chỉ định tập dữ liệu trong phương pháp thử nghiệm khác, nó sẽ sử dụng lại tập dữ liệu từ phương thức trước (ngẫu nhiên?) đã thay đổi tập dữ liệu, IMHO khá xấu và rất dễ xảy ra lỗi) . Ở đây, bất kỳ thử nghiệm nào khác mà không có cuộc gọi như vậy ở đầu của nó sẽ chỉ sử dụng bộ dữ liệu thử nghiệm như bình thường.
  • Bạn có thể tạo tập dữ liệu thử nghiệm của mình trên bộ dữ liệu chung (test case). Nếu bạn sử dụng hoạt động INSERT (không phải CLEAN_INSERT), nó sẽ chèn các hàng cụ thể cho thử nghiệm sau khi tất cả các hàng từ tập dữ liệu chung. Bạn cũng có thể sử dụng thao tác DELETE để xóa một số hàng không mong muốn khỏi tập dữ liệu chung đó.
  • BTW, không gọi onSetUp() làm cho công việc này ngay cả khi hoạt động thiết lập của trường hợp thử nghiệm đã được thay đổi.
8

Bạn có thể làm theo mẹo bẩn như:

protected function getDataSet() 
{ 
    if (in_array($this->getName(), array('testA', 'testB', '...'))) { 
     return $this->createXMLDataSet(__DIR__ . '/_fixtures/fistureA.xml'); 
    } 

    return $this->createXMLDataSet(__DIR__ . '/_fixtures/fixtureB.xml'); 
} 

lưu ý nhỏ: $this->getName() trả về tên phương pháp kiểm tra dòng

Một phương pháp khác là để tái chạy thiết lập hoạt động trong bắt đầu của thử nghiệm:

public function testA() 
{ 
    $this->getDatabaseTester()->setDataSet($this->createFlatXMLDataSet(__DIR__ . '/_fixtures/fixtureForTestA.xml')); 
    $this->getDatabaseTester()->onSetUp(); 

    /* your test code */ 
} 
+0

Tôi nghĩ đơn giản hơn rất nhiều so với các phiên bản trước đó. Tại sao họ làm cho nó phức tạp? – eddy147

+0

@ eddy147: Đây là phiên bản duy nhất tôi từng thấy trong dbunit – zerkms

+0

tôi không nên sử dụng dbunit chút nào và viết các bộ dữ liệu chuẩn bị tùy chỉnh của riêng mình bằng giao diện của nó – eddy147

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