感谢你来到这里
我真的很激动
盼望,能有你的支持
捐赠可扫描二维码转账支付
支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
在功能测试中去认证请求可能会拖慢(测试)组件。当使用 form_login
时这尤其会成为一个问题。因为它需要附加的请求来填充和提交表单。
解决方案之一是配置防火墙,在test环境下使用 http_basic
,如同在 如何在功能测试中模拟HTTP Authentication 一文中所解释的。另一个办法是,你自己创建一个token并把它存到session中。这么做时,你不得不确保正确的cookie随着请求被发送出来。下例演示了此一技巧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // tests/AppBundle/Controller/DefaultControllerTest.php
namespace Tests\Appbundle\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
class DefaultControllerTest extends WebTestCase
{
private $client = null;
public function setUp()
{
$this->client = static::createClient();
}
public function testSecuredHello()
{
$this->logIn();
$crawler = $this->client->request('GET', '/admin');
$this->assertTrue($this->client->getResponse()->isSuccessful());
$this->assertGreaterThan(0, $crawler->filter('html:contains("Admin Dashboard")')->count());
}
private function logIn()
{
$session = $this->client->getContainer()->get('session');
// the firewall context (defaults to the firewall name)
// 防火墙上下文(默认是防火墙名称)
$firewall = 'secured_area';
$token = new UsernamePasswordToken('admin', null, $firewall, array('ROLE_ADMIN'));
$session->set('_security_'.$firewall, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
} |
如何在功能测试中模拟HTTP Authentication 一文中的技巧更为简洁明了,应成为首选。
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。