首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在API平台上进行授权测试

在API平台上进行授权测试
EN

Stack Overflow用户
提问于 2020-01-06 01:43:22
回答 2查看 1.3K关注 0票数 0

我正在使用Symfony 4.4和api-platform/api-pack v1.2.1 PERM_

  • I

  • ,我创建了一个自定义投票者,它支持带有前缀的字符串,设置端点(/api/roles),让security: 'is_granted("PERM_READ_USER")'
  • I创建一个测试,如下所示:

代码语言:javascript
运行
复制
    /**
     * @depends testLoginRegularUser
     * @param $token
     * @return string JWT Token
     */
    public function testRegularUserReadRole($token)
    {
        $this->expectException(AccessDeniedHttpException::class);
        $this->expectExceptionCode(403);
        $response = static ::createClient()->request('GET', '/api/roles',[
            'json' => [
                'page' => 1
            ],
            'headers' => [
                'Authorization' => 'Bearer ' . $token,
            ]
        ]);
        return $token;
    }

我总是收到错误信息:

代码语言:javascript
运行
复制
Testing App\Tests\Functional\GroupRoleTest
.2020-01-06T00:49:48+00:00 [error] Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: "Access Denied." at /home/vagrant/Code/wikaunting/vendor/symfony/security-http/Firewall/ExceptionListener.php line 137
FS                                                                 3 / 3 (100%)

Time: 14.27 seconds, Memory: 44.50 MB

There was 1 failure:

1) App\Tests\Functional\GroupRoleTest::testRegularUserReadRole
Failed asserting that exception of type "Symfony\Component\HttpClient\Exception\AccessDeniedHttpException" is thrown.

当我使用rest客户端(Insomenia)进行测试时,它会返回

代码语言:javascript
运行
复制
{
  "@context": "\/api\/contexts\/Error",
  "@type": "hydra:Error",
  "hydra:title": "An error occurred",
  "hydra:description": "Access Denied.",
  "trace": [
  {
      "namespace": "",
      "short_class": "",
      "class": "",
      "type": "",
      "function": "",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/security-http\/Firewall\/ExceptionListener.php",
      "line": 137,
      "args": []
    },
    {
      "namespace": "Symfony\\Component\\Security\\Http\\Firewall",
      "short_class": "ExceptionListener",
      "class": "Symfony\\Component\\Security\\Http\\Firewall\\ExceptionListener",
      "type": "->",
      "function": "handleAccessDeniedException",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/security-http\/Firewall\/ExceptionListener.php",
      "line": 102,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ],
        [
          "object",
          "Symfony\\Component\\Security\\Core\\Exception\\AccessDeniedException"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\Security\\Http\\Firewall",
      "short_class": "ExceptionListener",
      "class": "Symfony\\Component\\Security\\Http\\Firewall\\ExceptionListener",
      "type": "->",
      "function": "onKernelException",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/event-dispatcher\/Debug\/WrappedListener.php",
      "line": 126,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ],
        [
          "string",
          "kernel.exception"
        ],
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\EventDispatcher\\Debug",
      "short_class": "WrappedListener",
      "class": "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener",
      "type": "->",
      "function": "__invoke",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/event-dispatcher\/EventDispatcher.php",
      "line": 264,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ],
        [
          "string",
          "kernel.exception"
        ],
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\EventDispatcher",
      "short_class": "EventDispatcher",
      "class": "Symfony\\Component\\EventDispatcher\\EventDispatcher",
      "type": "->",
      "function": "doDispatch",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/event-dispatcher\/EventDispatcher.php",
      "line": 239,
      "args": [
        [
          "array",
          [
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ]
          ]
        ],
        [
          "string",
          "kernel.exception"
        ],
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\EventDispatcher",
      "short_class": "EventDispatcher",
      "class": "Symfony\\Component\\EventDispatcher\\EventDispatcher",
      "type": "->",
      "function": "callListeners",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/event-dispatcher\/EventDispatcher.php",
      "line": 73,
      "args": [
        [
          "array",
          [
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ],
            [
              "object",
              "Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener"
            ]
          ]
        ],
        [
          "string",
          "kernel.exception"
        ],
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\EventDispatcher",
      "short_class": "EventDispatcher",
      "class": "Symfony\\Component\\EventDispatcher\\EventDispatcher",
      "type": "->",
      "function": "dispatch",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/event-dispatcher\/Debug\/TraceableEventDispatcher.php",
      "line": 168,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ],
        [
          "string",
          "kernel.exception"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\EventDispatcher\\Debug",
      "short_class": "TraceableEventDispatcher",
      "class": "Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher",
      "type": "->",
      "function": "dispatch",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/http-kernel\/HttpKernel.php",
      "line": 207,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent"
        ],
        [
          "string",
          "kernel.exception"
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\HttpKernel",
      "short_class": "HttpKernel",
      "class": "Symfony\\Component\\HttpKernel\\HttpKernel",
      "type": "->",
      "function": "handleThrowable",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/http-kernel\/HttpKernel.php",
      "line": 79,
      "args": [
        [
          "object",
          "Symfony\\Component\\Security\\Core\\Exception\\AccessDeniedException"
        ],
        [
          "object",
          "Symfony\\Component\\HttpFoundation\\Request"
        ],
        [
          "integer",
          1
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\HttpKernel",
      "short_class": "HttpKernel",
      "class": "Symfony\\Component\\HttpKernel\\HttpKernel",
      "type": "->",
      "function": "handle",
      "file": "\/home\/vagrant\/Code\/wikaunting\/vendor\/symfony\/http-kernel\/Kernel.php",
      "line": 201,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpFoundation\\Request"
        ],
        [
          "integer",
          1
        ],
        [
          "boolean",
          true
        ]
      ]
    },
    {
      "namespace": "Symfony\\Component\\HttpKernel",
      "short_class": "Kernel",
      "class": "Symfony\\Component\\HttpKernel\\Kernel",
      "type": "->",
      "function": "handle",
      "file": "\/home\/vagrant\/Code\/wikaunting\/public\/index.php",
      "line": 25,
      "args": [
        [
          "object",
          "Symfony\\Component\\HttpFoundation\\Request"
        ]
      ]
    }
  ]
}

我认为它可能返回AccessDeniedException,而不是AccessDeniedException,所以我将测试更改为

代码语言:javascript
运行
复制
$this->expectException(\Symfony\Component\Security\Core\Exception\AccessDeniedException::class);

但是它仍然返回类似的错误。

代码语言:javascript
运行
复制
1) App\Tests\Functional\GroupRoleTest::testRegularUserReadRole
Failed asserting that exception of type "Symfony\Component\Security\Core\Exception\AccessDeniedException" is thrown.

问题

它是否应该返回一个exception?

  • The [error] Uncaught PHP Exception ...消息总是出现。如何使它消失?
EN

回答 2

Stack Overflow用户

发布于 2020-01-06 09:24:59

您正在将功能与单元测试结合在一起。当代码抛出异常时,$this->expectException用于单元测试。

在这种情况下,您将对客户端执行HTTP请求,该请求将返回响应,不会引发异常。您应该检查响应状态代码为403。

票数 3
EN

Stack Overflow用户

发布于 2020-01-06 09:34:38

请记住,该异常不会在测试中抛出。当您的请求被拒绝时,将抛出"serverside“。因此,您不应该断言抛出异常,而是在测试中检查状态代码和该请求的响应。API平台为此提供了辅助方法。

结帐:

代码语言:javascript
运行
复制
self::assertResponseStatusCodeSame
self::assertJsonContains
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59605768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档