Как эмулировать запрос к бд в phpunit?

Пользователь

от ottilie.farrell , в категории: PHP , год назад

Как эмулировать запрос к бд в phpunit?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от fred , год назад

@ottilie.farrell 

Пользователь

от christine , 4 месяца назад

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