@ottilie.farrell
В PHPUnit можно эмулировать запрос к БД, используя класс PDOStatement и метод execute() для выполнения запроса.
Прежде всего, вам необходимо создать заглушку для класса PDO, чтобы заменить реальное подключение к БД на эмулированный объект. Это можно сделать с помощью класса PHPUnitFrameworkTestCase и его методов getMock() и getMockBuilder().
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
use PHPUnitFrameworkTestCase;
class DatabaseTest extends TestCase
{
public function testQuery()
{
// Создаем эмулированный объект PDO
$pdoMock = $this->getMockBuilder(PDO::class)
->disableOriginalConstructor()
->getMock();
// Создаем объект эмулированного запроса
$stmtMock = $this->getMockBuilder(PDOStatement::class)
->disableOriginalConstructor()
->getMock();
// Ожидаем вызов метода execute() на объекте запроса и возвращаем значения вместо реального выполнения запроса
$stmtMock->expects($this->any())
->method('execute')
->willReturn(true);
// Подставляем эмулированный объект запроса вместо реального объекта в эмулированном объекте PDO
$pdoMock->expects($this->any())
->method('prepare')
->willReturn($stmtMock);
// Создаем объект класса, который обращается к БД через PDO
$database = new Database($pdoMock);
// Вызываем метод, который делает запрос к БД
$result = $database->getUsers();
// Проверяем результат запроса
$this->assertTrue($result);
}
}
|
В данном примере мы эмулируем запрос getUsers() класса Database, который использует объект PDO для выполнения запроса.
Таким образом, при запуске тестовой функции testQuery() запрос к БД будет эмулирован, и вместо реального выполнения запроса будет возвращено заданное значение (в данном случае true).