Сначала вы должны изменить этот метод на нестатический.
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
, вы не сможете имитировать его. Вот почему:
Допустим, вы используете класс ImageService
, который напрямую использует статический метод get_accepted_images
. Нравится:
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 переопределяет исходную ImageDatabaseHelper, используемую ImageService, и он думает, что использует ее. От этого вы можете делать все, что хотите! (это также включает создание исключений для ImageDatabaseHelper!)
Развлекайся!
person
Tomas Prado
schedule
03.06.2014