用户代理无法使用phpunit

时间:2018-03-25 07:00:06

标签: php laravel phpunit

我使用了laravel 5和jenssegers / agent'。 用户代理可以通过浏览器访问用户。

但是,当我使用php-unit时,用户代理无法获得。 你知道这个原因吗? 当我检查http-headers时。看起来好像不发送这个标题信息。

根据一项调查,当我使用

var_dump($request->header('user-agent')); 
var_dump($request->server('HTTP_USER_AGENT')); 
var_dump($_SERVER['HTTP_USER_AGENT']);

在控制器和exec phpunit上。 $ request->标头('用户代理'),var_dump($ request->服务器(' HTTP_USER_AGENT'));可以得到参数。但是,var_dump($ _ SERVER [' HTTP_USER_AGENT']);没有。 我希望jenssegers / agent'使用$ _SERVER参数。

    public function testAccessAsiPhone()
{
    $headers = [
        'user-agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
    ];
    $this->withServerVariables($this->transformHeadersToServerVars($headers))
            ->visit('/')
            ->see('iPhone')
            ->see('iOS')
            ->see('Safari');
}

1 个答案:

答案 0 :(得分:1)

我还没有看到您正在测试的代码,但也许您不应该依赖超级全局代码。另外,我认为您遇到问题,因为更新$ _SERVER值时,代表$ _SERVER的请求对象不会更新。

就您的代码而言,您可以假设$_SERVER['HTTP_USER_AGENT']将返回正确的代理,因此您的代码不应该关注它。

而不是这个(假设的):

public function doSomething()
{
    if ($_SERVER['HTTP_USER_AGENT'] === 'iPhone') {
        return 'apple';
    }
    return 'banana';
}

你可以把它分开,这样你就可以嘲笑它了:

public function doSomething()
{
    if ($this->getUserAgent() === 'iPhone') {
        return 'apple';
    }
    return 'banana';
}

public function getUserAgent()
{
    return $_SERVER['HTTP_USER_AGENT'];
}

现在,您可以模拟单元测试不关注的代码部分:

public function testDoSomething()
{
    $mock = $this->getMockBuilder(YourClass::class)
        ->setMethods(['getUserAgent'])
        ->getMock();

    $mock->expects($this->once())->method('getUserAgent')->willReturn('iPhone');

    $this->assertSame('apple', $mock->doSomething());
}

希望这有帮助。