[英]Symfony2 functional test and session persistance
這是我的問題,我從功能測試控制器添加了會話變量,它們不會彈出測試目標操作。
我做了一個登錄方法,並使用了烹飪書建議來登錄。我對其進行了一些調整,以允許2個帳戶登錄:admin和superadmin
/**
* @param $account string the account to log in with (authorized : superadmin and admin)
*/
protected function logIn($account)
{
$this->session = $this->container->get('session');
// Cookbook try
// $this->session = new Session(new MockFileSessionStorage());
$user = $this->em->getRepository('LCHUserBundle:User')->findOneByUsername($account);
$firewall = 'admin_area';
switch($account) {
case self::SUPER_ADMIN_LOGIN:
$token = new UsernamePasswordToken($user, $account, $firewall, array('ROLE_SUPER_ADMIN'));
$this->client->setServerParameter("SERVER_NAME", SiteControllerTest::ROOT_SITE);
$this->client->setServerParameter("HTTP_HOST", SiteControllerTest::ROOT_SITE);
break;
case self::ADMIN_LOGIN:
$token = new UsernamePasswordToken($user, $account, $firewall, array('ROLE_ADMIN'));
// Session var I wish to have on my controller action tested
$this->session->set('currentSite', $this->em->getRepository('LCHMultisiteBundle:Site')->find(1));
$this->session->save();
// Use to force server canonical name for admin test
$this->client->setServerParameter("SERVER_NAME", SiteControllerTest::ROOT_SITE);
$this->client->setServerParameter("HTTP_HOST", SiteControllerTest::TEST_SITE);
break;
default:
throw new UsernameNotFoundException('Username provided doesn\'t match any authorized account');
}
// Save user in session
$this->session->set('_security_'.$firewall, serialize($token));
$this->session->set('user', $user);
$this->session->save();
// $this->container->set('session', $this->session);
$cookie = new Cookie($this->session->getName(), $this->session->getId());
$this->client->getCookieJar()->set($cookie);
我的setUp()方法可以做到這一點:
/**
* {@inheritDoc}
*/
protected function setUp()
{
// Initiates client
$this->client = static::createClient();
$this->container = $this->client->getContainer();
$this->application = new Application($this->client->getKernel());
$this->application->setAutoExit(false);
$this->translator = $this->container->get('translator');
$this->em = $this->container
->get('doctrine')
->getManager();
}
您可以看到我為身份驗證設置了會話變量。 當我從經過測試的操作中轉儲會話var時,它們會正確顯示,但是如果我添加currentSite會話var,它似乎不會持續存在。 當我使用客戶端提供的測試容器時,應該將其傳遞嗎?
PS:根據另一個問題 ,我還覆蓋了Client類。
我發現有很多關於該主題的帖子,但是都沒有提供任何可行的解決方案( 此 , 該一個或那個 )。 我也找到了這本食譜書 。
更新:感謝Alex Blex的發言,在這里我澄清了部分問題。
尚不清楚您正在測試什么,您的期望是什么以及失敗的地方。 添加實際測試將是有意義的。 為什么在測試中根本不需要容器,翻譯器等?
會話無需執行任何特殊操作。 考慮以下示例控制器,該控制器在會話中保留“ test”的值,並在連續調用時將其遞增:
/**
* @Route("/session")
* @Method({"GET"})
*/
public function session()
{
$session = $this->container->get('session');
$current = $session->get('test', 0);
$session->set('test', $current + 1);
return new Response($current);
}
並且此測試通過:
/**
* @test
*/
public function session_increments()
{
$client = static::createClient();
$client->request("GET", '/session');
$this->assertEquals('0', $client->getResponse()->getContent());
$client->request("GET", '/session');
$this->assertEquals('1', $client->getResponse()->getContent());
}
您的應用程序邏輯可能更復雜,但是測試應該保持幾乎相同-第一次調用登錄,第二次聲明響應包含對登錄用戶唯一的東西。
更新
應盡可能避免在功能測試中使用內部實現,但是對於某些極端情況(例如,簡化測試場景)可能是必不可少的。
以下示例通過在測試方案中為會話變量設置特定的值來測試同一控制器,並檢查該值是否由應用返回:
/**
* @test
*/
public function session_returns_value()
{
$client = static::createClient();
$session = $client->getContainer()->get('session');
$session->set('test', 12);
$client->request("GET", '/session');
$this->assertEquals('12', $client->getResponse()->getContent());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.