2014-12-16 23 views
5

Tôi đang cố gắng thử nghiệm các phương pháp từ lớp sau đây tôi đã viết (có nhiều chức năng hơn so với những gì được thể hiện, về cơ bản, một chức năng cho từng được _ *() phương pháp):Làm thế nào để PHPUnit kiểm tra một phương thức không có giá trị trả về?

class Validate { 
    private static $initialized = false; 

    /** 
    * Construct won't be called inside this class and is uncallable from the outside. This prevents 
    * instantiating this class. This is by purpose, because we want a static class. 
    */ 
    private function __construct() {} 

    /** 
    * If needed, allows the class to initialize itself 
    */ 
    private static function initialize() 
    { 
    if(self::$initialized) { 
     return; 
    } else { 
     self::$initialized = true; 
     //Set any other class static variables here 
    } 
    } 

    ... 

    public static function isString($string) { 
    self::initialize(); 
    if(!is_string($string)) throw new InvalidArgumentException('Expected a string but found ' . gettype($string)); 
    } 

    ... 

} 

Khi tôi kiểm tra nếu phương pháp ném một ngoại lệ trên đầu vào không hợp lệ, nó hoạt động tuyệt vời! Tuy nhiên, khi tôi kiểm tra xem phương thức này có hoạt động như mong đợi hay không, PHPUnit phàn nàn vì tôi không có khẳng định trong bài kiểm tra. Lỗi cụ thể là:

# RISKY This test did not perform any assertions 

Tuy nhiên, tôi không có bất kỳ giá trị nào để khẳng định vì vậy tôi không chắc chắn cách khắc phục điều này.

Tôi đã đọc một số về phương pháp thử nghiệm tĩnh, nhưng chủ yếu dường như bao gồm các phụ thuộc giữa các phương pháp tĩnh. Hơn nữa, ngay cả các phương pháp không tĩnh cũng không có giá trị trả về, vì vậy, cách khắc phục điều này?

Để tham khảo, mã thử nghiệm của tôi:

class ValidateTest extends PHPUnit_Framework_TestCase { 
    /** 
    * @covers ../data/objects/Validate::isString 
    * @expectedException InvalidArgumentException 
    */ 
    public function testIsStringThrowsExceptionArgumentInvalid() { 
    Validate::isString(NULL); 
    } 

    /** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
    Validate::isString("I am a string."); 
    } 
} 
+2

Tại sao phương thức đó không trả lại đúng/sai? Tại sao nó sẽ là một ngoại lệ khi một giá trị không phải là chuỗi được truyền như tham số, như là một phương thức để kiểm tra nếu một cái gì đó là một chuỗi, nên mong đợi các giá trị không phải chuỗi hoặc không có tiện ích cho phương thức. Điều này có vẻ giống như một phương pháp hình thành. –

+0

@MikeBrant Nó không trả lại vì nó không cần. Tôi sử dụng các phương pháp trong mã của tôi như là một break/khẳng định - nếu phương pháp không ném một ngoại lệ mã của tôi vẫn tiếp tục như bình thường. Nếu có, ngoại lệ phải được xử lý. Không có lý do gì để trả lại bất cứ thứ gì từ các phương thức này, và thậm chí ít lý do hơn để viết các câu lệnh if/else và các chu kỳ chi tiêu kiểm tra các giá trị trả lại đó. Tôi muốn ngoại lệ thay vì TRUE/FALSE vì các ngoại lệ có thể dừng thực thi mã. Nếu bạn đặt một int trong đó một mảng nên đi trong Java (hoặc hầu hết các ngôn ngữ đã gõ), bạn sẽ nhận được một ngoại lệ. Tôi muốn có chức năng tương tự. –

+0

@MikeBrant Hơn nữa, kiểm tra thích hợp có nghĩa là đảm bảo phương pháp của tôi hoạt động cho cả đầu vào không hợp lệ và hợp lệ. –

Trả lời

3

Một giải pháp tôi đã đến trên là những điều sau đây, dựa trên example 2.12 from chapter 2 of PHPUnit. Nó cảm thấy một chút hacky với tôi, nhưng đó là tốt nhất tôi đã tìm thấy cho đến nay. Ngoài ra, dựa trên điều này PHPUnit Gitub issue discussion, có vẻ như một số người khác muốn tính năng này nhưng không có kế hoạch để thực hiện nó.

Thay đổi testIsStringNoExceptionArgumentValid() như sau:

/** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
    try { 
     Validate::isString("I am a string."); 
    } catch (InvalidArgumentException $notExpected) { 
     $this->fail(); 
    } 

    $this->assertTrue(TRUE); 
    } 
+1

Bạn không cần bit try/catch. Không cần phải thất bại(), ngoại lệ sẽ làm điều đó. –

+0

Cách kiểm tra phương thức không trả lại bất kỳ thứ gì và không ném bất kỳ ngoại lệ nào – Somar

2

thử nghiệm chức năng khoảng trống với assertNull:

/** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
     $this->assertNull(Validate::isString("I am a string.")); 
    } 
Các vấn đề liên quan