English spoken conference

You are browsing the Symfony 4.3 documentation, which changes significantly from Symfony 3.x. If your app doesn't use Symfony 4.3 yet, browse the Symfony 3.4 documentation.

How to Test the Interaction of several Clients

4.3 version

How to Test the Interaction of several ClientsΒΆ

If you need to simulate an interaction between different clients (think of a chat for instance), create several clients:

 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());

This works except when your code maintains a global state or if it depends on a third-party library that has some kind of global state. In such a case, you can insulate your clients:

 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());

Insulated clients transparently execute their requests in a dedicated and clean PHP process, thus avoiding any side effects.

Tip

As an insulated client is slower, you can keep one client in the main process, and insulate the other ones.

Caution

Insulating tests requires some serializing and unserializing operations. If your test includes data that can't be serialized, such as file streams when using the UploadedFile class, you'll see an exception about "serialization is not allowed". This is a technical limitation of PHP, so the only solution is to disable insulation for those tests.

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.