首先你应该把这个方法改成非静态的。
public function get_accepted_images($limit, $page, $uuid) {
try {
$conn = new pdo_connect();
$query = "SELECT...";
$result = $conn->prepare($query);
$result->bindParam(':uuid', $uuid);
$result->execute();
$array_result = $result->fetchAll(PDO::FETCH_OBJ);
$paginate_result = WS_Utility::paginate_array($array_result, $page, $limit);
$result_Set = array($paginate_result, TRUE);
} catch (Exception $e) {
$result_Set = array($e->getMessage(), FALSE);
}
return $res;
}
接下来就是在这个方法上进行一些集成测试(不是单元测试)。
当您进行集成测试时,您并不关心方法是如何实现的,但您应该准确了解方法的合同(例如:在此输入上将接收此输出,在此上下文上将收到此异常等)
基于此方法合同的知识,您开始进行集成测试:
class ImageDatabaseHelperIntegrationTest extends PHPUnit_Framework_TestCase
{
//The most simple test. When no images exists in the DB what happens?
public function testWhenNoImagesExistsReturnCorrectResult() {
$sut = new ImageDatabaseHelper(); //I dont know what is the name of the class
$actual = $sut->get_accepted_images(1,1,1);
$expected = array(null, FALSE); //?? I dont know what the result is. you know this
$this->assertEquals($expected, $actual);
}
//You should keep doing like this.
//The next tests will include inserting data in the database, and testing what is the output
编辑:
user3421904 写道:但为什么不是静态的呢?我们不能这样做吗:$actual =
images::get_accepted_images(1, 1, 11); 这个对我有用
好吧!错了吗?
没有错。但是,如果您要对消耗 ImageDatabaseHelper 的其他组件进行单元测试,您将无法模拟它。原因如下:
假设您正在使用一个直接使用get_accepted_images 静态方法的ImageService 类。像这样:
class ImageService {
public function getAcceptedImages() {
$images = ImageDatabaseHelper::get_accepted_images(1,1,1);
//...
//more code
//...
return $images;
}
}
如何在不访问数据库的情况下测试getAcceptedImages 方法?你不能,对吧?
现在假设您执行非静态方法。
class ImageService {
private $imageDatabaseHelper;
public function __construct(ImageDatabaseHelper $imageDatabaseHelper = null) {
if(!$imageDatabaseHelper) {
$this->imageDatabaseHelper = new ImageDatabaseHelper();
}
else {
$this->imageDatabaseHelper = $imageDatabaseHelper;
}
}
public function getAcceptedImages() {
$images = $this->imageDatabaseHelper->get_accepted_images(1,1,1);
//...
//more code
//...
return $images;
}
}
这很容易测试!!!
class ImageServiceTest extends PHPUnit_Framework_TestCase {
protected $sut;
protected $imageDatabaseHelperDouble;
public function setUp() {
$this->imageDatabaseHelperDouble = $this->getMockBuilder('ImageDatabaseHelper')->disableOriginalConstructor()->getMock();
$this->sut = new ImageService($this->imageDatabaseHelperDouble);
}
public function testGetAcceptedImagesWhenCalledShouldCallImageDatabaseHelper() {
$this->imageDatabaseHelperDouble->expected($this->once())->method('get_accepted_images')->with(1,1,1);
$this->sut->getAcceptedImages();
}
public function testGetAcceptedImagesWhenCalledShouldReturnImages() {
$this->imageDatabaseHelperDouble->expected($this->any())->method('get_accepted_images')->will($this->returnValue(array("hi im an image", "me tooo")));
$actual = $this->sut->getAcceptedImages();
$expected = array("hi im an image", "me tooo");
$this->assertEquals($expected, $actual);
}
}
你看到了吗?模拟的 ImageDatabaseHelper 覆盖了 ImageService 使用的原始 ImageDatabaseHelper,他认为他正在使用它。从此你可以为所欲为! (这也包括让 ImageDatabaseHelper 抛出异常!)
玩得开心!