PHPUnit中如何测试包含或本地文件

3
我有一个简单的类内方法,它执行以下操作:
 class ToBeTested
 {
      public function getLocalSettings()
      {
          require_once 'local.php';

           return (isset($configSetting['foo'])) ? true : false;
      }
 }

在local.php文件中

 <?
      $configSetting = array(
           'foo' => '1',
           'bar' => 'false',
      );

我希望创建用于getLocalSettings的单元测试。我意识到这有点像依赖注入,但我无法理解应该如何编写测试。似乎这是一段非常琐碎的代码块,并且过度复杂化了测试,但我在这里有重新构建的自由,想要用我的值/数据提供者替换'local.php'以进行测试。 为了更好的阐明/评论: 我在这里使用配置文件作为示例,但实际上我们正在使用一个从数据库输出并包含为数据源的巨大文件,并在此函数中进行解析。我写了一个简化版本,避免使问题变得过于复杂,但所包含的数组有几个MB,并不仅仅是一个配置文件。不幸的是,提供不同方式处理文件配置的解决方案并不会有所帮助,但注入该数组的方法完全可以(但是在某些时候我需要运行那个“require”)。
谢谢。
1个回答

4

您应该通过构造函数或setter将配置数组注入到ToBeTested类中。这将消除getLocalSettings(包含另一个文件)引起的副作用,并允许您在测试时模拟设置。

您的类定义可能如下所示:

class ToBeTested
{
    private $localSettings;

    public function __construct($localSettings)
    { 
        $this->localSettings = $localSettings;
    }
}

然后,在正常使用时,只需将配置数组提供给构造函数即可实例化此类(应在引导代码中包含local.php)。 当您想要对该类进行单元测试时,可以在实例化时注入任何需要的设置,并且您不会对文件系统有任何硬依赖。您可以选择使用PHPUnit中的数据提供程序功能(文档)来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接