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:

異なるクライアント間の相互作用をシミュレートする必要がある場合 (たとえば achat を考えてください)、複数のクライアントを作成します。
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 run their requests in a dedicated and clean PHP process, thus avoiding any side effects.

隔離されたクライアントは、専用のクリーンな PHP プロセスで透過的にリクエストを実行するため、副作用が回避されます。

Tip

ヒント

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

隔離されたクライアントは低速であるため、1 つのクライアントをメインプロセスに保持し、他のクライアントを隔離することができます。

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.

テストの分離には、いくつかのシリアライズ操作とアンシリアライズ操作が必要です。 UploadedFile クラスを使用するときのファイル ストリームなど、シリアル化できないデータがテストに含まれている場合、「シリアル化は許可されていません」という例外が表示されます。これは PHP の技術的な制限であるため、唯一の解決策は、これらのテストの分離を無効にすることです。