【问题标题】:PHP mock test not working at the method call part inside PHPUnitPHP 模拟测试在 PHPUnit 内的方法调用部分不起作用
【发布时间】:2021-08-23 12:25:42
【问题描述】:

我在 PHPStorm 上运行 PHP 8,并且正在尝试为返回 IP 字符串的函数创建测试。我正在使用 PHPUnit 和 PHPMock

我的测试中有以下代码:

$UserIpAddress = $this->getFunctionMock(__NAMESPACE__, 'ip_request');
        $UserIpAddress->expects($this->once())
            ->method('getRealIpAddr')
            ->willReturn('127.0.0.1');

我的错误是

Method name is already configured

然而,当我删除它时,我得到一个错误,它应该被调用。

我已经复制粘贴了函数名,它肯定在正确的类中。

我的命名空间是正确的,使用该功能的实际页面工作正常。

有什么想法吗?

谢谢

【问题讨论】:

    标签: php phpunit phpstorm tdd


    【解决方案1】:

    已修复!经过大量检查各种选项后,应该进入测试文件的代码是

    $local = new ip_request();
            $this->assertEquals('127.0.0.1', $local->getRealIpAddr());
    

    在实际的类文件中

    $ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
    

    我认为 ?? '127.0.0.1' 不应该留作生产。

    【讨论】:

    • 仅供参考:$_SERVER['REMOTE_ADDR'] 在 CLI 环境(运行 PHPUnit 测试的地方)中运行时自然会为空。与其他 $_SERVER 索引相同,这些索引仅在 Web 服务器下运行时才会填充(例如 HTTPS 状态等)。因此$_SERVER['REMOTE_ADDR'] ?? '127.0.0.1' 在这里对你有意义。
    • 如果您需要测试 getRealIpAddr() 方法逻辑(它会根据标头检测正确的 IP),那么您需要手动提供不同的 IP(为 $_SERVER 提供自定义内容只是为了测试此方法)。我建议检查:1)如何在 PHPUnit 中备份/恢复全局状态($_SERVER 是什么):phpunit.readthedocs.io/en/9.5/fixtures.html#global-state
    • 2) 以及查看流行的框架如何测试它(例如 Symfony github.com/symfony/http-foundation/blob/5.3/Tests/… ——尽管它使用隐藏硬“全局”部分的抽象可能不是最好的——它是全部通过Request 实例完成,可以在测试中使用自定义数据进行初始化......所以很容易测试)。您可能希望以不同的方式编写 ip_request() 类(接受 $_SERVER 的内容作为构造函数中的参数并将其保存在类中 - 因此在 PHPUnit 测试中您可以传递自定义数据)
    猜你喜欢
    • 2020-11-15
    • 2014-03-26
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2013-08-18
    • 2019-03-13
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多