【问题标题】:Symfony functional test - custom headers not passing throughSymfony 功能测试 - 自定义标头未通过
【发布时间】:2012-07-17 23:28:55
【问题描述】:

由于某种原因,当我发送一个新的 $client->请求我指定的标头丢失:

public function testGetClientsAction()
{
    $client = static::createClient();

    $cookie = new Cookie('locale2', 'en', time() + 3600 * 24 * 7, '/', null, false, false);
    $client->getCookieJar()->set($cookie);

    // Visit user login page and login
    $crawler = $client->request('GET', '/login');
    $form = $crawler->selectButton('login')->form();
    $crawler = $client->submit($form, array('_username' => 'greg', '_password' => 'greg'));

    $client->request(
       'GET', 
       '/clients', 
        array(), 
        array(), 
        array('X-Requested-With' => 'XMLHttpRequest', 'accept' => 'application/json')
    );

    print_r($client->getResponse());
    die();

}

在正在测试的方法中,我在第一行有这个:

print_r($request->headers->all());

回复如下:

Array
(
    [host] => Array
        (
            [0] => localhost
        )

    [user-agent] => Array
        (
            [0] => Symfony2 BrowserKit
        )

    [accept] => Array
        (
            [0] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        )

    [accept-language] => Array
        (
            [0] => en-us,en;q=0.5
        )

    [accept-charset] => Array
        (
            [0] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
        )

    [referer] => Array
        (
            [0] => http://localhost/login_check
        )

    [x-php-ob-level] => Array
        (
            [0] => 1
        )

)

【问题讨论】:

    标签: symfony phpunit


    【解决方案1】:

    我也有同样的问题,经过一番研究后,我认为这是 BrowserKit 目前不支持的功能。

    我已经为它记录了一个问题: https://github.com/symfony/symfony/issues/5074

    更新:这不是问题 - 请参阅下面的 cmets

    示例代码

    示例请求:

    $client->request(
        'GET',
        $url,
        array(),
        array(),
        array(
            'HTTP_X_CUSTOM_VAR' => $var
        )
    );
    

    获取数据:

    $request->headers->get('x-custom-var');
    

    【讨论】:

    • 更新:从我从问题中的 stof 获得的评论中,只需通过在自定义标头前加上“HTTP_”前缀来传递自定义标头的变体,它就会起作用。在我的案例中,请参阅上述问题以获取工作示例。
    • 好东西。感谢您的帮助!
    • 现在不再是这种情况了 (sym2.5) - 没有前缀的标头很好!以symfony.com/doc/current/book/testing.html 为例
    • @gregor 只是部分正确。自定义标头仅适用于“HTTP_”前缀,而标准标头键将适用。
    • 经过这么长时间仍然是有效的响应。这个决定背后的理由是什么?看起来很荒谬。
    【解决方案2】:

    如果你从 Client.php 检查定义,在方法请求时,你会在 docblock 中看到一个非常有用的信息:

    • @param 数组 $server 服务器参数(HTTP 标头与 PHP 一样使用 HTTP_ 前缀引用)

    这意味着您应该在要发送的标头中添加 HTTP_ 前缀。例如,如果您想传递标头 X-HTTP-Method-Override,您可以像这样指定它:

        $client->request(
            Request::METHOD_POST,
            '/api/v1/something',
            $body,
            [],
            ['HTTP_X-HTTP-Method-Override' => Request::METHOD_GET]
        );
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2022-11-29
      • 2021-02-06
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      相关资源
      最近更新 更多