在PHPUnit中测试包含的文件或本地文件

时间:2013-03-04 19:08:39

标签: php unit-testing dependency-injection phpunit dataprovider

我在类中有一个简单的方法,可以执行以下操作

 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'以进行测试

编辑清晰度/评论

我在这里使用了配置作为示例,但我们实际使用的是一个巨大的文件,它从数据库输出并作为数据源包含,并在此函数中进行解析。我写了一个简化版本,以避免过于复杂的问题,但包含的数组是几个megs而不是实际上只是一个配置文件。不幸的是,提供处理文件配置的不同方法的解决方案没有帮助,但注入此数组的方法可以正常工作(但在某些时候我需要运行'require'。

由于

1 个答案:

答案 0 :(得分:4)

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

class ToBeTested
{
    private $localSettings;

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

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