我有这个Behat设置:
default:
extensions:
Behat\Symfony2Extension: ~
Behat\MinkExtension:
sessions:
default:
symfony2: ~
Run Code Online (Sandbox Code Playgroud)
这个场景:
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
Run Code Online (Sandbox Code Playgroud)
我检查用户是否经过身份验证,如果是,则在Twig中显示他的分页控制:
{% if is_granted('IS_AUTHENTICATED_FULLY') %}
...
Run Code Online (Sandbox Code Playgroud)
相关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');
}
Run Code Online (Sandbox Code Playgroud)
我得到true的
$this->kernel
->geContainer()
->get('security.authorization_checker')
->isGranted('IS_AUTHENTICATED_FULLY')
Run Code Online (Sandbox Code Playgroud)
在我的,iShouldSeePaginationControl()但它是false在渲染的内容.
我错过了什么?
我的猜测是,您在行为步骤和模板中使用了不同的容器实例。
AFAIR,symfony2 驱动程序在底层使用 BrowserKit 来浏览您的网站。然后,将在您的网页中使用的容器将由您的 Web 服务器的 PHP 引擎(而不是 Behat)实例化。如果是这样,那么绝对不可能在运行时一步操作容器中的修改并期望 Web 服务器能够感知到它们。
简单的解决方案是在行为步骤中实际登录(通过 Web 界面),而不是手动设置令牌。
如果您绝对想以编程方式登录,另一种更困难的方法是在 HDD 上序列化创建的令牌并注册某种逻辑(例如 kernel.request 侦听器),该逻辑将检查该文件是否可用并将未序列化的令牌注入安全上下文。如果这样做,请确保仅在测试环境中启用此逻辑,因为这可能会造成安全漏洞。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |