如何让 PHPUnit 测试使用 returns IP 的函数?
How to get PHPUnit testing working with a function that returns an IP?
我是 TDD 的新手,我已经安装了带有 PhpStorm 的 PHPUnit。
我有这个 class 和功能,我想测试 IP 地址匹配。
class ip_request
{
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
}
我正在尝试创建测试代码,但不确定要放入什么。
我试过了
public function testGetRealIpAddr()
{
$expected = '127.0.0.1';
$this->assertEquals($expected, $test);
}
但是$test
显然是未定义的
接下来我该做什么?
尝试过给出的建议
public function testGetRealIpAddr()
{
$UserIpAddress = $this
->getMockBuilder('ip_request')
->getMock();
$UserIpAddress->expects($this->once())
->method('getRealIpAddr')
->willReturn('127.0.0.1'); // Set ip address whatever you want to use
}
但是我现在得到的错误是
Trying to configure method "getRealIpAddr()" which cannot be configured because it does not exist, has not been specified, is final, or is static
您要测试的方法/函数有一个隐藏依赖:$_SERVER
。
发现这一点还可以找到一种解决方案,使代码更加模块化且更易于测试。
这通过使用可选参数公开先前的隐藏依赖项来实现:
function getRealIpAddr(array $server = null)
{
$server ??= $_SERVER;
if (!empty($server['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip = $server['HTTP_CLIENT_IP'];
} elseif (!empty($server['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip = $server['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $server['REMOTE_ADDR'];
}
return $ip;
}
然后在单元测试中根据输入测试函数结果。
然而,单元测试无法突出该功能存在的大量安全问题,这可能超出了您的问题范围,所以我只留下评论。
我按照@hakre 建议的方式解决了这个问题,
$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
我在该语句的末尾添加了 ?? '127.0.0.1'
,然后修复了它。
也刚刚更新了我的测试功能以仅显示
$local = new ip_request();
$this->assertEquals('127.0.0.1', $local->getRealIpAddr());
我是 TDD 的新手,我已经安装了带有 PhpStorm 的 PHPUnit。
我有这个 class 和功能,我想测试 IP 地址匹配。
class ip_request
{
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
}
我正在尝试创建测试代码,但不确定要放入什么。
我试过了
public function testGetRealIpAddr()
{
$expected = '127.0.0.1';
$this->assertEquals($expected, $test);
}
但是$test
显然是未定义的
接下来我该做什么?
尝试过给出的建议
public function testGetRealIpAddr()
{
$UserIpAddress = $this
->getMockBuilder('ip_request')
->getMock();
$UserIpAddress->expects($this->once())
->method('getRealIpAddr')
->willReturn('127.0.0.1'); // Set ip address whatever you want to use
}
但是我现在得到的错误是
Trying to configure method "getRealIpAddr()" which cannot be configured because it does not exist, has not been specified, is final, or is static
您要测试的方法/函数有一个隐藏依赖:$_SERVER
。
发现这一点还可以找到一种解决方案,使代码更加模块化且更易于测试。
这通过使用可选参数公开先前的隐藏依赖项来实现:
function getRealIpAddr(array $server = null)
{
$server ??= $_SERVER;
if (!empty($server['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip = $server['HTTP_CLIENT_IP'];
} elseif (!empty($server['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip = $server['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $server['REMOTE_ADDR'];
}
return $ip;
}
然后在单元测试中根据输入测试函数结果。
然而,单元测试无法突出该功能存在的大量安全问题,这可能超出了您的问题范围,所以我只留下评论。
我按照@hakre 建议的方式解决了这个问题,
$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
我在该语句的末尾添加了 ?? '127.0.0.1'
,然后修复了它。
也刚刚更新了我的测试功能以仅显示
$local = new ip_request();
$this->assertEquals('127.0.0.1', $local->getRealIpAddr());