Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正确要求单元测试_Php_Oop_Testing_Phpunit - Fatal编程技术网

Php 正确要求单元测试

Php 正确要求单元测试,php,oop,testing,phpunit,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->

我一直在为一个应用程序编写单元测试,希望测试一个具有
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语句从文件系统加载文件。因为它与基础设施交互,所以应该进行集成测试,而不是单元测试。但是,有一些方法可以与文件系统分离,以便您可以正确地对其进行单元测试

集成测试

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

单元测试

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

例如:

类配置加载器
{
公共函数加载($file)
{
$config=需要$file;
如果(!is_数组($config)){
抛出新的InvalidConfigFileException(sprintf('未在“%s”中找到配置,$file));
}
返回$config;
}
}
选择哪种方法?

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


如果config类的职责纯粹与加载配置文件有关,那么集成测试它。如果还有其他问题,请将文件加载责任提取到它自己的类中。

因此,由于
集成
测试,您认为它应该保持原样吗?我的意思是,如果用户没有提供特定的“键/值/任何东西”,应用程序崩溃了怎么办?在你看来,我应该采用集成方法吗?:)取决于配置类中有多少逻辑-这个类的职责是什么?如果纯粹是为了加载文件集成,请测试它。如果有更多的事情要做——将加载责任提取到它自己的类中。