使用Behat和Symfony2登录方案之前

soy*_*uka 7 php symfony behat

首先,我已经阅读了这个相关问题另一种方法(博客文章).

这是我的behat.yml:

default:
    suites:
        users:
            contexts:
                - DoctrineFixturesContext
                - FeatureContext
                - Behat\MinkExtension\Context\MinkContext
                - Sanpi\Behatch\Context\RestContext
                - Sanpi\Behatch\Context\JsonContext
            paths: [%paths.base%/features/users]
    extensions:
        Behat\Symfony2Extension: 
            kernel:
                env: "test"
                debug: "true"
        Behat\MinkExtension:
            base_url: ''
            sessions:
                default:
                    symfony2: ~
        Sanpi\Behatch\Extension: ~
Run Code Online (Sandbox Code Playgroud)

现在我想要的是重现用户的行为,即:

  • 用户登录一次
  • 然后,请求具有Authorization带令牌的标头

我发现最简单的方法是简单地模仿用户行为:

class FeatureContext implements Context, SnippetAcceptingContext
{
    private $request;

    public function __construct(Request $request)
    {
        $this->request = $request; 
    }

    /**
     * @BeforeScenario @Login
     */
    public function login() 
    {
        $d = $this->request->send('POST', '/login_check', ['_username' => 'test', '_password' => 'test']);
        $data = json_decode($d->getContent());
        $this->request->setHttpHeader('Authorization', 'Bearer '.$data->token);
    }
}
Run Code Online (Sandbox Code Playgroud)

用户之前通过固定装置加载.这种方法很有效,但Authorization标题不会通过后续步骤保留:

Feature: Get my availables menus
  @Login
  Scenario: Get my menus
    When I send a "GET" request to "/api/menus"
    Then the response status code should be 200
Run Code Online (Sandbox Code Playgroud)

回复是401.

为什么Authorization标头没有保留在场景中?我怎样才能完成这个简单的任务?

小智 2

正如您可以在此处阅读,在此处阅读,Behatch/RestContext 非常有用(有很多快捷方式和少数方法),但它与 symfony2 集成非常混乱。

正如@stof 在这条评论中所说:

其余上下文完全是一个巨大的错误。Mink 不是 REST 客户端(浏览器也不是 REST 客户端)。使用 Mink 驱动程序执行 REST API 调用是没有意义的。这是不适合这项工作的工具。

长话短说:看来您设置的请求标头没有随请求一起传递。

话虽如此,您可以尝试使用此解决方法:

Feature: Get my availables menus
  @Login
  Scenario: Get my menus
    # note the change in the following line
    # When I send a "GET" request to "/api/menus"
    When I am on "/api/menus"
    Then the response status code should be 200
Run Code Online (Sandbox Code Playgroud)

基本上,使用When I am on...您正在使用 MinkContext 并且请求标头已随请求正确传递。

当然,我知道这不是完美的解决方案(例如:如何处理 POST 请求??),但至少您描述的特定测试应该通过。

让我知道。再见