Unit testing 允许集成测试cakephp中的所有身份验证操作

Unit testing 允许集成测试cakephp中的所有身份验证操作,unit-testing,cakephp,integration-testing,cakephp-3.0,Unit Testing,Cakephp,Integration Testing,Cakephp 3.0,我目前正试图为某个控制器编写一个集成测试,因此有必要发送一个身份验证头。在我的控制器中,我通过以下代码公开了一些操作: namespace App\Controller\Api; use Cake\Event\Event; use Cake\Network\Exception\UnauthorizedException; use Cake\Utility\Security; use Firebase\JWT\JWT; class UsersController extends AppCont

我目前正试图为某个控制器编写一个集成测试,因此有必要发送一个身份验证头。在我的控制器中,我通过以下代码公开了一些操作:

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();
    }
}

通常,可以在重写的
\Cake\TestSuite\IntegrationTestCase::controllerSpy()
方法中操作控制器,如

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

    if (isset($this->_controller)) {
        $this->_controller->Auth->allow();
    }
}
但是正如评论中已经提到的,最好是正确地验证您的请求

虽然集成测试不一定必须是黑盒测试,但窥视测试主题的内部并不是一个好主意。当您正在寻找介于“测试一切”和“测试单元”之间的东西时,模拟集成测试中的某些部分可能是合理的,即更大的模块组,但这应该仅在请求涉及高度复杂性时才有必要

另见


这有点违背了集成测试的目的,不是吗?也许您实际上在寻找的是在经过身份验证的状态下访问操作?是的,这是真的,因为我是集成测试新手,所以我不确定如何模拟无状态身份验证的身份验证。由于我已经花了一天的时间试图让它正常工作,我现在只想绕过身份验证过程,稍后再解决这个问题。谢谢,这个成功了:)。我知道这不是最终让集成测试用例通过的方法,因此我将尝试使身份验证部分工作。