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


Testing Included or Local Files in PHPUnit

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

 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'为测试目的

编辑为清晰/注释

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

谢谢

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

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

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