Behat场景中Twig is_granted失败

时间:2017-11-07 12:17:44

标签: 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

我错过了什么?

2 个答案:

答案 0 :(得分:0)

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

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

简单的解决方案是实际登录behat步骤(通过Web界面),而不是手动设置令牌。

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

答案 1 :(得分:0)

问题是您运行了2个Symfony实例:

  • Behat的一个核心,已初始化。
  • 其次,由Mink连接到服务器触发的apache / nginx初始化。

解决方案

为此,我们在另一个项目(Zend)中有一个解决方案。 我们创建了服务,为授权创建了一个额外的配置:

  • 如果文件存在且项目处于DEV模式,则会在初始化步骤中加载。

然后在hook / step中我们可以调用生成类似文件的服务,并在方案之后删除它。这样,您可以在项目中拥有任何已登录的用户。

另一种方法是调用将通过标准表单登录到项目中的步骤。