2013-06-24 49 views
10

Vừa mới nhảy vào PHPUnit gần đây, đã đọc nội dung về nó, hãy thử một số ví dụ để có thể viết bài kiểm tra cho các dự án tương lai của tôi.PHPUnit: Kiểm tra mảng đối tượng

Tôi cần phải kiểm tra kịch bản này, tôi có Học sinh lớp đó là như thế này:

class Students 
{ 
    public function getStudents($studentName, $studentId) 
    {  
     $students= array(); 

     //Instantiating OldStudent Class from Old Project 
     $oldStudents = \OldStudents::getStudentByName($studentName, $studentId); 

     //Create a Student Object for every OldStudent found on Old Project and set 
     //values 
     foreach ($oldStudents as $oldStudent) 
     {    
      $student = new \Entity\Student(); 

      //Set Student ID 
      $student->setStudentId($oldStudent->getStudentID()); 

      //Set Student Name 
      $student->setStudentName($oldStudent->getStudentName());  
      //.....other setters for student data, irrelevant for this example 

      $students[] = $student;    
     } 

     return $students; 
    } 
} 

Và Lớp Student

Class Student 
{ 
    protected $studentId; 
    protected $studentName; 

    public function getStudentId() 
    { 
     return $this->studentId; 
    } 
    public function setStudentId($studentId) 
    { 
     $this->studentId = $studentId; 
     return $this; 
    } 
    public function getStudentName() 
    { 
     return $this->studentName; 
    } 
    public function setStudentName($studentName) 
    { 
     $this->studentName = $studentName; 
     return $this; 
    } 
} 

Bây giờ làm thế nào tôi có thể kiểm tra xem các Học sinh lợi nhuận Lớp một mảng các đối tượng có các giá trị được đặt và kiểm tra các giá trị bằng cách sử dụng getters từ Học sinh Lớp

Xin vui lòng ném một số ánh sáng/thông tin/liên kết bất cứ điều gì hướng dẫn tôi trong con đường chính xác.

Cảm ơn

Trả lời

24

Tôi đã viết một số mã ví dụ bên dưới; Tôi đoán các tham số cho getStudents là các bộ lọc tùy chọn. Chúng tôi có một bài kiểm tra để có tất cả học sinh. Tôi không biết nếu họ luôn quay trở lại theo thứ tự sắp xếp, đó là lý do tại sao tôi không kiểm tra bất cứ điều gì khác trong lớp học sinh viên. Bài kiểm tra thứ hai nhận được một học sinh cụ thể và bắt đầu kiểm tra một số thuộc tính của Học sinh.

class StudentsTest extends PHPUnit_Framework_TestCase{ 

    public function testGetAllStudents(){ 
     $s=new Students; 
     $students=$s->getStudents("",""); 
     $this->assertInternalType('array',$students); 
     $this->assertEquals(7,count($students)); 
     $first=$students[0]; //Previous assert tells us this is safe 
     $this->assertInstanceOf('Student',$first); 
    } 

    public function testGetOnlyStudentNamedBob(){ 
     $s=new Students; 
     $students=$s->getStudents("Bob",""); 
     $this->assertInternalType('array',$students); 
     $this->assertEquals(1,count($students)); 
     $first=$students[0]; //Previous assert tells us this is safe 
     $this->assertInstanceOf('Student',$first); 
     $this->assertEquals('Bob',$first->getStudentName()); 
    } 
} 

Đây là bước đầu tiên tốt. Sau khi bạn sử dụng nó trong một thời gian bạn sẽ nhận ra nó là khá mong manh. I E. bạn phải có chính xác 7 học sinh cho kỳ thi đầu tiên để vượt qua. Phải có chính xác một sinh viên được gọi là Bob cho lần thứ hai để vượt qua. Nếu \OldStudents::getStudentByName của bạn lấy dữ liệu từ cơ sở dữ liệu, nó cũng sẽ bị chậm; chúng tôi muốn kiểm tra đơn vị chạy nhanh nhất có thể.

Việc sửa chữa cho cả hai điều này là giả lập cuộc gọi đến \OldStudents::getStudentByName. Sau đó, bạn có thể tiêm dữ liệu nhân tạo của riêng bạn, và sau đó bạn sẽ chỉ được thử nghiệm logic trong getAllStudents. Điều này có nghĩa là khi kiểm tra đơn vị của bạn bị hỏng thì chỉ có 20 đường hoặc nhiều hơn nơi bạn có thể phá vỡ nó, không phải 1000 giây.

Chính xác cách thực hiện việc nhạo báng là một câu hỏi toàn bộ, và có thể phụ thuộc vào phiên bản PHP và cách thiết lập mã linh hoạt của bạn. ("OldStudents" có vẻ như bạn đang xử lý mã cũ và có thể bạn không thể chạm vào mã đó.)

+0

Xin chào Darren, bạn hoàn toàn đúng với "OldStudents" nó thực sự là mã kế thừa và tôi không thể chạm vào nó. Cảm ơn mã ví dụ của bạn. Im trong một sửa chữa mà câu trả lời tôi muốn upvote như cả hai bạn đã trả lời thỏa mãn :) – 125369

+1

Vâng, bạn giành chiến thắng nó !!! – 125369

3

Bạn có thể làm điều đó với các xác nhận. Trước hết, bạn nên thu được kết quả thực tế là thực tế, sau đó thực hiện một số xác nhận với kết quả đó. Hãy so sánh:

Bạn có thể khẳng định rằng nó là một mảng:

class InternalTypeTest extends PHPUnit_Framework_TestCase 
{ 
    public function testFailure() 
    { 
     $this->assertInternalType('array', 42); 
    } 
} 

Sau đó, bạn có thể khẳng định rằng nó không phải là rỗng (như bạn đã biết nó phải trả lại một số dữ liệu) :

class NotEmptyTest extends PHPUnit_Framework_TestCase 
{ 
    public function testFailure() 
    { 
     $this->assertNotEmpty(ARRAY()); 
    } 
} 

Và sau đó bạn có thể khẳng định rằng mỗi giá trị là của bạn student-type:

class InstanceOfTest extends PHPUnit_Framework_TestCase 
{ 
    public function testFailure() 
    { 
     $this->assertInstanceOf('Student', new Exception); 
    } 
} 

Tôi hy vọng điều này sẽ cung cấp cho bạn một số gợi ý. Xem liên kết ở trên để biết danh sách các xác nhận chung. Nếu bạn sử dụng một IDE để ghi lại bài kiểm tra của bạn, nó sẽ cung cấp một danh sách tất cả các xác nhận.

10

PHPUnit kể từ phiên bản 3.1.4 có xác nhận "assertContainsOnly" với tham số "type" có thể khẳng định bất kỳ loại PHP nào (bao gồm các cá thể và các kiểu nội bộ), và trong ít nhất phiên bản 3.7 có xác nhận "assertContainsOnlyInstancesOf" chỉ kiểm tra rõ ràng các cá thể lớp, không phải các kiểu biến PHP.

Vì vậy, các thử nghiệm kiểm tra nếu một mảng chỉ chứa các đối tượng của một loại nhất định chỉ đơn giản là:

$this->assertContainsOnlyInstancesOf('Student', $students); 

Lưu ý rằng việc kiểm tra này ngầm kiểm tra rằng $students hoặc là một mảng hoặc một đối tượng thực hiện các giao diện traversable. Việc thực thi Traversable không có nghĩa là bạn có thể đếm, do đó, gọi assertCount sau đó để xác nhận số lượng đối tượng Student hiện tại không được đảm bảo để thành công, nhưng kiểm tra thêm rằng giá trị trả về thực tế là một mảng có vẻ quá nhiều sưng lên với tôi ở đây. Bạn đang tạo và trả về một mảng với một cái gì đó trong đó - nó là an toàn để giả sử bạn có thể đếm nó. Nhưng điều này có thể không phải là trường hợp ở khắp mọi nơi.

+0

Hàm này thực sự là 'assertContainsOnlyInstancesOf()' (các thể hiện nên là số nhiều). – kielabokkie

+0

Cảm ơn vì đã phát hiện lỗi đánh máy đó - sự lười biếng của tự động hoàn thành có thể đã đánh tôi. Vui lòng chỉnh sửa lỗi chính tả như vậy ở đây trên SO. Họ sẽ nhận được vào một hàng đợi và được xem xét, và tác giả ban đầu sẽ được thông báo. Bằng cách đó, việc cập nhật thông tin không chính xác trở nên dễ dàng hơn. – Sven

+0

Tôi đã thử nhưng vì tôi chỉ thay đổi hai ký tự, nó sẽ không chấp nhận nó;) – kielabokkie

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