如何测试多个客户端之间的交互
如果你需要模拟不同客户端之间的交互(例如,考虑一个聊天应用),创建多个客户端
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 进程中运行其请求,从而避免任何副作用。
提示
由于隔离的客户端速度较慢,你可以将一个客户端保留在主进程中,而隔离其他客户端。
警告
隔离测试需要一些序列化和反序列化操作。如果你的测试包含无法序列化的数据,例如使用 UploadedFile
类时的文件流,你将看到关于“不允许序列化”的异常。这是 PHP 的技术限制,因此唯一的解决方案是为这些测试禁用隔离。
本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。