如何让PHPUnit测试与返回IP的函数一起工作



我是TDD的新手,我已经用PhpStorm安装了PHPUnit。

我有这个类和函数,我想测试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);
}

但CCD_ 1显然是未定义的。

我下一步该怎么办?

已尝试给出的建议

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());

最新更新