2016-03-12 63 views
0

我正在嘗試爲某些控制器編寫集成測試,因此需要發送身份驗證標頭。在我的控制,我有一些行爲使公衆開放,通過下面的代碼:允許在集成測試中進行身份驗證的所有操作cakephp

namespace App\Controller\Api; 

use Cake\Event\Event; 
use Cake\Network\Exception\UnauthorizedException; 
use Cake\Utility\Security; 
use Firebase\JWT\JWT; 

class UsersController extends AppController 
{ 
    public function initialize() 
    { 
     parent::initialize(); 
     $this->Auth->allow(['add', 'token']); // public methods 
    } 
    ..... 
} 

現在我有,我想,讓所有的行動都可能不經認證訪問的集成測試案例。有沒有簡單的方法可以做到這一點?

整合案例代碼:

namespace App\Test\TestCase\Controller; 

use App\Controller\Api\UsersController; 
use Cake\TestSuite\IntegrationTestCase; 

class ApiPicturesControllerTest extends IntegrationTestCase{ 
    public $fixtures = [ 
     'app.albums', 
     'app.pictures', 
     'app.users', 
     'app.comments', 
     'app.users_albums' 
    ]; 
    public function setUp(){ 
     parent::setUp(); 
     // Allow all actions 
     // $this->Auth->allow(); 
    } 
    public function testViewShouldPass(){ 
     $this->configRequest([ 
      'headers' => [ 
       'Accept' => 'application/json' 
      ] 
     ]); 
     $data = $this->get('/api/pictures/1.json'); 
     $this->assertResponseOk(); 
    } 
} 
+0

這會有點擊敗集成測試的目的看,是不是?也許你真正在尋找的是以認證狀態訪問操作? – ndm

+0

是的,因爲我不熟悉集成測試,所以我不確定如何模擬無狀態身份驗證的身份驗證。由於我已經堅持了一天,試圖讓這個工作,我現在只想繞過認證過程,並稍後修復。 – markvdlaan93

回答

0

一般是可以操縱控制器在被覆蓋的\Cake\TestSuite\IntegrationTestCase::controllerSpy()方法,像

public function controllerSpy($event) 
{ 
    parent::controllerSpy($event); 

    if (isset($this->_controller)) { 
     $this->_controller->Auth->allow(); 
    } 
} 

但在評論中已經提到,倒不如正確請驗證您的請求!

雖然集成測試並不一定是黑盒測試,但窺視測試對象的內部並不是一個非常好的主意。當您在「測試所有」和「測試單元」(即更大的模塊組)之間尋找某種東西時,嘲諷集成測試中的某些部分可能是合理的,但在請求中涉及大量複雜時,大多數情況下只需要這些部分。

+0

謝謝,這工作:)。我知道這不是最終讓集成測試用例通過的方式,因此我會嘗試使驗證部分正常工作。 – markvdlaan93

相關問題