symfony - Twig is_granted 在 Behat 场景中失败

标签 symfony bdd behat

我有这个 Behat 设置:

default:
    extensions:
        Behat\Symfony2Extension: ~
        Behat\MinkExtension:
            sessions:
                default:
                    symfony2: ~

而这个场景:
Scenario: Event list for authenticated user
  Given I am authenticated
   Then I should see pagination control
    And I should be able to change list page

我检查用户是否经过身份验证,如果是,则在 Twig 中显示分页控件:
{% if is_granted('IS_AUTHENTICATED_FULLY') %}
...

相关Behat上下文:
/**
 * @Given I am authenticated
 */
public function iAmAuthenticated()
{
    $user = new User('test', null, ['ROLE_USER']);
    $token = new UsernamePasswordToken($user, null, 'test', $user->getRoles());

    $this->getTokenStorage()->setToken($token);
}


/**
 * @Then I should see pagination control
 */
public function iShouldSeePaginationControl()
{
    $this->assertSession()->elementExists('css', 'ul.pagination');
}

我得到 true为了
$this->kernel
    ->geContainer()
    ->get('security.authorization_checker')
    ->isGranted('IS_AUTHENTICATED_FULLY') 

在我的iShouldSeePaginationControl()但它是 false在呈现的内容中。

我错过了什么?

最佳答案

我的猜测是您在行为步骤和模板中使用了不同的容器实例。

AFAIR,symfony2 驱动程序在后台使用 BrowserKit 来浏览您的网站。然后,将在您的网页中使用的容器将由您的 Web 服务器的 PHP 引擎(而不是 Behat)实例化。如果是这样,绝对不可能在运行时一步操作容器中的修改,并期望 Web 服务器会知道它们。

简单的解决方案是在行为步骤中实际登录(通过 Web 界面),而不是手动设置 token 。

如果您绝对想以编程方式登录,另一种更难的方法是在 HDD 上序列化创建的 token 并注册某种逻辑(例如 kernel.request 监听器),该逻辑将检查此文件是否可用并将未序列化的 token 注入(inject)安全上下文。如果这样做,请确保仅在 TEST 环境中启用此逻辑,因为它可能会导致安全漏洞。

关于symfony - Twig is_granted 在 Behat 场景中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47157806/

相关文章:

php - symfony2 Doctrine 删除对象数组

php - Symfony2 子应用程序的主页

iOS - 为什么使用 quick and nimble vs XCTest

escaping - Cucumber 步骤定义中的转义字符

php - 吃掉内存

soap - 使用soap的段错误php7 symfony cli命令

php - 交响乐 3 : Debugging with Symfony's development server

java - Restful Spring Boot BDD 测试

symfony - 使用 Behat 3 测试 Symfony2 电子邮件

shell - 如何将结果从 shell 脚本保存在 excel 中的单独列中?