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

编辑清晰度/评论

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

谢谢

4

1 回答 1

4

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

class ToBeTested
{
    private $localSettings;

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

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

于 2013-03-04T19:29:56.467 回答