【问题标题】:How to get PHPUnit testing working with a function that returns an IP?如何使用返回 IP 的函数进行 PHPUnit 测试?
【发布时间】:2021-08-23 07:14:41
【问题描述】:

我刚接触 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);
    }

但是$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

【问题讨论】:

标签: php phpunit phpstorm tdd


【解决方案1】:

你要测试的方法/函数有一个隐藏的依赖$_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;
}

在单元测试中,您然后根据输入测试函数结果。

但是单元测试并不能突出该函数存在的大量安全问题,这可能超出了您的问题的范围,所以我只发表评论。

【讨论】:

  • 谢谢我确实解决了这个问题,但我很感激你向我展示了这个方法,谢谢。
【解决方案2】:

我以类似于@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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 2011-10-10
    • 1970-01-01
    • 2011-06-02
    • 2013-06-20
    • 2016-06-04
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多