2011-12-15 98 views
2

我想爲通過Symfony2身份驗證機制保護的控制器編寫功能測試。我看了很多教程描述它但不幸的是所有的人不適合我目前的Symfony2的版本(2.0.4測試2.0.7到)在Symfony2單元測試中處理身份驗證

我迄今所做的工作:

添加在config_test.yml安全設置

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 

    providers: 
     main: 
      users: 
       admin: { password: adminsmurf, roles: [ 'ROLE_USER' ] } 
       inventory: { password: inventorysmurf, roles: [ 'ROLE_ADMIN', 'ROLE_USER', 'ROLE_INVENTORY' ] } 
       andon: { password: andonsmurf, roles: [ 'ROLE_ADMIN', 'ROLE_ANDON' ] } 

    firewalls: 
     main: 
      pattern: /.* 
      http_basic: 
       realm: "Secured Area" 
       provider: main 
      logout:  true 
      security: true 
      stateless: true 
      anonymous: true 

單元測試

class DefaultControllerTest extends WebTestCase 
{ 

    public function testCorrectAuthentificationCredentials() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('GET', '/inventory/index', array(), array(), 
            array(
              'PHP_AUTH_USER' => 'admin', 
              'PHP_AUTH_PW' => 'adminsmurf' 
             )); 

     $response = $client->getResponse(); 

     $this->assertEquals(200, $response->getStatusCode()); 
    } 
} 

該測試失敗(預計200,獲得302)。任何人都可以幫助我做錯什麼嗎?

更新16/12

我拿到了一步。正如我在我的常規安全文件中使用表單登錄。 Symfony剛剛將http_basic登錄添加到防火牆。這是重定向的原因(302)。我剛剛添加了一個

form_login: false 

以測試安全設置。現在沒有重定向,但我得到了一個401狀態代碼。

+0

302是重定向。你能檢查你重定向到哪裏嗎? – 2011-12-15 16:11:29

回答

3

我顯示HTTP基本身份驗證應該作爲第四個參數來請求,而不是第五個。來源是文檔 - 如果它們不起作用,我們需要更新它們。不過,讓我知道:

http://symfony.com/doc/2.0/cookbook/testing/http_authentication.html

而且,一旦你這個工作正常,你可以把窗體身份驗證回,因爲symfony不會有任何理由使用窗體的入口點(< - 花式字:))重定向你。

希望有幫助!

1

就我而言,問題在於測試環境使用單獨的數據庫,但我忘記了將它與用戶一起填充。 m)

我知道,這可能不是真正解決您的問題的方法,但是讓我們來看看如果每個人都遇到同樣的問題,會得到多少點贊成票。如果沒有人這樣做,那麼,我是唯一那個愚蠢的人。

順便說一下,您可以嘗試使用內存提供程序來查看您的身份驗證是否因數據庫問題等原因而失敗。這就是我發現我的問題是什麼的。