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.");
}
}
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. –
@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ự. –
@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ệ. –