Як тестувати взаємодію декількох клієнтів

Дата оновлення перекладу 2022-11-24

Як тестувати взаємодію декількох клієнтів

Якщо вам потрібно зімітувати взаємодію між різними клієнтами (наприклад, уявіть собі чат), створіть декілька клієнтів:

1
2
3
4
5
6
7
8
9
10
11
// ...
use Symfony\Component\HttpFoundation\Response;

$harry = static::createClient();
$sally = static::createClient();

$harry->request('POST', '/say/sally/Hello');
$sally->request('GET', '/messages');

$this->assertEquals(Response::HTTP_CREATED, $harry->getResponse()->getStatusCode());
$this->assertRegExp('/Hello/', $sally->getResponse()->getContent());

Це працює у всіх випадках, за виключенням того, якщо у вашому коді є глобальний стан або він якщо він залежить від сторонньої бібліотеки, яка має якийсь глобальний стан. У такому випадку, ви можете ізолювати ваших клієнтів так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ...
use Symfony\Component\HttpFoundation\Response;

$harry = static::createClient();
$sally = static::createClient();

$harry->insulate();
$sally->insulate();

$harry->request('POST', '/say/sally/Hello');
$sally->request('GET', '/messages');

$this->assertEquals(Response::HTTP_CREATED, $harry->getResponse()->getStatusCode());
$this->assertRegExp('/Hello/', $sally->getResponse()->getContent());

Ізольовані клієнти прозоро виконують свої запити у виділеному чистому PHP-процесі, таким чином уникаючи будь-яких побічних ефектів.

Tip

Так як ізольований клієнт повільніший, ви можете тримати одного клієнта в основному процесі та ізолювати інших.

Тести ізоляції вимагають деяких операцій сеіалізації та десеріалізації. Якщо ваш тест містить дані, які не можуть бути серіалізовані, такі як потоки файлів при використанні класу UploadedFile, ви побачите виключення "серіалізація не дозволена". Це технічне обмеження PHP, тому єдиним вирішенням буде відключити ізоляцію для цих тестів.