2011-01-10 21 views
12

Tôi không biết cách kiểm tra đơn vị Ngoại lệ với PHPUnit.Làm thế nào để kiểm thử đơn vị Ngoại lệ với PHPUnit?

Hãy xem phương pháp của tôi với Ngoại lệ:

public function getPhone($html, $tag = 'OFF', $indicative, $number_lenght) { 

     // .. code 

     if ($tag <> 'OFF') { 

      $html = $doc[$tag]->text(); // Apanho apenas o texto dentro da TAG 
       if (empty($html)) { 
        throw new Exception("Nao foi possivel apanhar qualquer texto dentro da TAG, Metodo em causa: getPhone()"); 
       }    
     } 

     // .. code 
    } 

Và bây giờ thử nghiệm PHPUnit tôi:

<?php 

require_once '../Scrap.php'; 

class ScrapTest extends PHPUnit_Framework_TestCase 
{ 

    protected $scrap; 

    // Setup function to instantiate de object to $this->scrap 
    protected function setUp() 
    { 
     $this->scrap = new Scrap; 
    } 

    /** 
    * @covers Scrap::getPhone 
    * @expectedException Exception 
    * 
    */ 
    public function testGetPhone() { 

     // Variables1 
     $array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678); 
     $phone_list1 = '</div>A Front para<br /><br /><br /><br /><br /><br />-Apoio;<br />-Criação;<br />-Campanhas;<br />-Promoções<br /><br /><br />CONDIÇÕES:<br /><br />Local de Trabalho: Es<br />Folgas: Mistas<br /><br /><br /><br />ordem 500€<br /><br /><br /><br />Mínimos:<br /><br />- Conhecimentos;<br />- Ensino ;<br />-INGLÊS.<br /><br /><br /><br />Candidaturas: <br />[email protected]<br />218559372 | 927 555 929 | <br />RH<br />Rua C. Sal. 40<br />1000-000 Lisboa<br /><br /><br />+351 21 3456789 | (351) 912345678'; 

     // Variables2 
     $array_static2 = Array(0 => 'NA'); 
     $phone_list2 = ""; 

     // .. more tests 

     // Test Exception, Tag not found 
     if (TRUE) { 

      // Bloco try/catch para confirmar que aqui lança excepção 
      try {    
        $this->scrap->getPhone($phone_list1, 'hr', '351', '9');   
       }   
      catch (Exception $expected) { 
        return;   
       }   

      $this->fail('An expected exception has not been raised.'); 
     } 



    } 
} 
?> 

Nếu tôi chạy thử nghiệm tôi đã "Failure":

1) ScrapTest::testGetPhone 
Expected exception Exception 

FAILURES! 
Tests: 1, Assertions: 5, Failures: 1. 

Ngoại lệ tăng lên nhưng tôi không muốn thất bại trong PHPUnit, Nếu ngoại lệ tăng lên, tôi muốn kiểm tra OK.

Bạn có thể cho tôi một số manh mối không?

Trân trọng,

+1

bản sao có thể có của [Cách sử dụng setExpectedException của PHPUnit()?] (Http://stackoverflow.com/questions/4646298/how-to-use-phpunits-setexpectedexception) – zerkms

+0

được hỏi chỉ một vài phút trước – Gordon

Trả lời

29

Bạn đang làm quá nhiều ở đó.

Ether sử dụng: @expectedException Exception

HOẶC: try/catch/$ this-> thất bại

Cách bạn đang làm việc đó ngay bây giờ nói "bắt ngoại lệ đó và sau đó hy vọng mã để ném một số khác! "

Cách đầu tiên là sạch hơn trong quan điểm của tôi bởi vì nó chỉ có 1 dòng chống lại 5 (hoặc thậm chí nhiều hơn) dòng mã và nó ít bị lỗi.

/** 
* @covers Scrap::getPhone 
* @expectedException Exception 
* 
*/ 
public function testGetPhone() { 

    // Variables1 
    $array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678); 
    $phone_list1 = '...'; 

    // Variables2 
    $array_static2 = Array(0 => 'NA'); 
    $phone_list2 = ""; 

    // .. more tests 

    // Bloco try/catch para confirmar que aqui lança excepção 
    $this->scrap->getPhone($phone_list1, 'hr', '351', '9');   

Điều đó sẽ thực hiện.

+4

Bạn có thể cũng sử dụng '$ this-> setExpectedException ('ExceptionTypeGoesHere')' ở đầu phương pháp thử nghiệm của bạn, cũng như hai liệt kê ở trên. Tôi nghĩ đây là cách tiếp cận sạch sẽ nhất. – TeaPow

12

Có hai cách để kiểm tra các ngoại lệ được ném nhưng tùy thuộc vào nhu cầu của bạn. Nếu bạn không quan tâm đến nội dung/tính chất của các ngoại lệ (mã ví dụ, tin nhắn, vv), sau đó bạn có thể làm:

$this->setExpectedException('MyApp\Exception'); 
$object->someFailingCodeWithException(); 

khác, nếu bạn cần phải sử dụng thuộc tính ngoại lệ cho sự khẳng định (ví dụ code) , sau đó bạn có thể làm try-catch-thất bại:

try { 
    $object->someFailingCodeWithException(); 
} catch (MyApp\Exception $e) { 
    $this->assertEquals($e->getCode(), 100); 
    return; 
} 

$this->fail(); 

Thông báo các return tuyên bố bên trong khối catch. Tuyên bố $this->fail(); sẽ/chỉ được gọi khi không có ngoại lệ. Vì vậy, trường hợp thử nghiệm này không thành công vì nó nên kiểm tra ngoại lệ mà không được ném ở nơi đầu tiên.

+1

Ít nhất là từ phpunit 6.1, nó không hoạt động nữa. _Bạn nên càng cụ thể càng tốt khi kiểm tra ngoại lệ. Việc kiểm tra các lớp quá chung chung có thể dẫn đến các tác dụng phụ không mong muốn. Theo đó, thử nghiệm cho lớp Ngoại lệ với @ unexpectedException hoặc setExpectedException() không còn được phép nữa._ https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for- phpunit.trường hợp ngoại lệ – dotnetCarpenter

+0

trong PHPunit 6+ chúng tôi cần sử dụng chức năng công cộng testGetPhone() { $ this-> expectException (\ InvalidArgumentException :: class); một số nguyên nhân gây ra ngoại lệ tại đây } –

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