Files
archived-symfony-docs/testing/insulating_clients.rst
2020-09-11 00:32:07 +02:00

56 lines
1.9 KiB
ReStructuredText

.. index::
single: Tests; Insulating clients
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::
// ...
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::
// ...
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 run 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.