我使用了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');
}
答案 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());
}
希望这有帮助。