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

标签 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 创建单元测试。我意识到这有点像依赖注入(inject),但我不太清楚应该如何编写测试。这似乎是一个非常微不足道的代码块,使测试变得过于复杂,但我可以自由重构,但是在这里,我想用我自己的值/数据提供程序替换“local.php”以进行测试

编辑清晰度/评论

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

谢谢

最佳答案

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

class ToBeTested
{
    private $localSettings;

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

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

关于php - 在 PHPUnit 中测试包含文件或本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15209147/

相关文章:

c# - Visual Studio 2012 Fakes - 如何验证调用的方法?

java - 一个 bean 中的作用域单例以及其他依赖 bean 的原型(prototype)

java - 业务层 Jersey 的基本依赖注入(inject)

javascript - XMLHttpRequest() 在函数中返回响应

php - 在sql中获取当前日期

java - 如何知道应用程序用户是否离线android应用程序?

visual-studio - 单元测试的 Resharper 问题

c++ - 使用 cxxtest 框架和 valgrind 测试 qt 对象

php - 格式化金额为数据库格式

ViewModel中的Android Hilt Dagger 注入(inject)接口(interface)@ViewModelInject得到了UninitializedPropertyAccessException