@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
).