2015-06-26 18 views
21

Tôi muốn biết nếu có một giải pháp về cách đơn vị kiểm tra một đặc điểm PHP.Làm thế nào để đơn vị kiểm tra các đặc điểm PHP

Tôi biết chúng tôi có thể kiểm tra một lớp đang sử dụng đặc điểm đó. nhưng tôi đã tự hỏi nếu có cách tiếp cận tốt hơn.

Cảm ơn lời khuyên trước :)

EDIT

Một thay thế là sử dụng Trait trong lớp thử nghiệm bản thân như tôi sẽ chứng minh dưới đây.

Nhưng I `m không phải là quan tâm về phương pháp này vì không có bảo lãnh không có tên phương pháp tương tự giữa các đặc điểm, lớp và cũng là PHPUnit_Framework_TestCase (trong ví dụ này):

Dưới đây là một Ví dụ đặc điểm:

trait IndexableTrait 
{ 
    /** @var int */ 
    private $index; 

    /** 
    * @param $index 
    * @return $this 
    * @throw \InvalidArgumentException 
    */ 
    public function setIndex($index) 
    { 
     if (false === filter_var($index, FILTER_VALIDATE_INT)) { 
      throw new \InvalidArgumentException('$index must be integer.'); 
     } 

     $this->index = $index; 

     return $this; 
    } 

    /** 
    * @return int|null 
    */ 
    public function getIndex() 
    { 
     return $this->index; 
    } 
} 

và thử nghiệm của nó:

class TheAboveTraitTest extends \PHPUnit_Framework_TestCase 
{ 
    use TheAboveTrait; 

    public function test_indexSetterAndGetter() 
    { 
     $this->setIndex(123); 
     $this->assertEquals(123, $this->getIndex()); 
    } 

    public function test_indexIntValidation() 
    { 
     $this->setExpectedException(\Exception::class, '$index must be integer.'); 
     $this->setIndex('bad index'); 
    } 
} 
+0

Vui lòng cung cấp mã bạn đã cố gắng để làm điều này mà không hoạt động. Điều đó sẽ giúp ai đó hỗ trợ bạn. –

+0

@AdamB, tôi đã tự viết [câu trả lời đầu tiên] (http://stackoverflow.com/a/31083193/4960774), trong đó có một mã mẫu. nhưng xin lưu ý nó không giống như một cái gì đó bị hỏng hoặc không hoạt động, tôi chỉ muốn biết nếu có bất kỳ phương pháp tốt để đơn vị kiểm tra các đặc điểm trực tiếp và không gián tiếp bởi đơn vị thử nghiệm một lớp học sử dụng đặc điểm đó. xe tăng – Ali

Trả lời

35

Bạn có thể thử nghiệm một trait sử dụng một simila r để thử nghiệm các phương thức cụ thể của Abstract Class.

PHPUnit has a method getMockForTrait mà sẽ trả về một đối tượng có sử dụng các tính trạng. Sau đó, bạn có thể kiểm tra các chức năng đặc điểm.

Dưới đây là ví dụ từ các tài liệu:

<?php 
trait AbstractTrait 
{ 
    public function concreteMethod() 
    { 
     return $this->abstractMethod(); 
    } 

    public abstract function abstractMethod(); 
} 

class TraitClassTest extends PHPUnit_Framework_TestCase 
{ 
    public function testConcreteMethod() 
    { 
     $mock = $this->getMockForTrait('AbstractTrait'); 

     $mock->expects($this->any()) 
      ->method('abstractMethod') 
      ->will($this->returnValue(TRUE)); 

     $this->assertTrue($mock->concreteMethod()); 
    } 
} 
?> 
Các vấn đề liên quan