php - 适当的要求单元测试

标签 php oop testing phpunit

我一直在为应用程序编写单元测试,想测试一个具有require 的方法。我的看法

public $configPath = __DIR__.'/path/to/config.php';

private function getConfig()
{
    if (!empty($this->config)) {
        return $this->config;
    }

    return $this->config = require $this->configPath;
}

public method foo()
{
    $config = $this->getConfig(); 
    //logic here
}

在测试用例中,相应的片段是

$class->config = ['bar' => 'baz'];

$class->foo();

我想知道这是否可以被视为正确的方法或应该使用其他技术/解决方案?

最佳答案

require 语句从文件系统加载文件。由于它与基础设施交互,因此应该进行集成测试而不是单元测试。但是,有一些方法可以与文件系统分离,因此您可以对其进行正确的单元测试。

集成测试

如果您决定为您的类编写集成测试,您可以通过构造函数参数使配置文件的路径可配置。通过这种方式,您将能够传递一个“测试”配置文件,其中包含您可以在测试中依赖的值。

单元测试

如果您决定编写单元测试,则需要将文件加载移出您的类。要么将加载配置文件的结果作为构造函数参数传递,要么将文件加载委托(delegate)给协作者(即 ConfigLoader)。您将能够在单元测试中 stub ConfigLoaderConfigLoader 的实现将非常简单,您将为它编写一个集成测试(只是为了查看是否加载了文件并返回了数组)。

例如:

class ConfigLoader
{
    public function load($file)
    {
        $config = require $file;

        if (!is_array($config)) {
            throw new InvalidConfigFileException(sprintf('Did not find configuration in "%s".', $file));
        }

        return $config;
    }
}

选择哪种方法?

这取决于您要测试的配置类的职责(记住单一职责原则)。

如果配置类的职责纯粹与加载配置文件有关——集成测试它。如果还有更多内容 - 将文件加载责任提取到它自己的类中。

关于php - 适当的要求单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38042912/

相关文章:

java - 我怎样才能有一个接受类型为 "my type"的参数的抽象方法?

ruby-on-rails - Rails Controller 中的功能测试重定向

python - 使用 pdb 调试 tox python 测试?

php - Laravel - 输入未通过单元测试

php - Twitter 搜索引擎系统过滤主题标签或@

python - Matplotlib 图作为新的类属性。稍后如何根据命令显示它?

ruby-on-rails - Rails、Cucumber 和本地化消息

php - 从 CodeIgniter 更新 MySQL 语句

php - 对 500 万行的数据库进行 boolean 搜索,非常慢

c++ - vector::clear() 幕后和破坏