【问题标题】:Unit testing of a class reading a configuration file读取配置文件的类的单元测试
【发布时间】:2016-04-25 01:19:32
【问题描述】:

我有一个“配置”类,它有一个方法“getConfig”,它读取一个配置文件“config.ini”,其中我有所有应用程序配置(数据库凭据和主机,一些 api 密钥,......)

现在我有这个单元测试来测试配置文件中是否存在数据库条目,同时确认方法“getConfig”返回的数组具有键“database”:

function testConfigFileHasDatabaseEntry()
{
    $configuration = Configuration::getInstance();
    $arrConfig = $configuration->getConfig();
    $this->assertArrayHasKey('database', $arrConfig);
}

我还有另一个单元测试确认“getConfig”返回一个数组类型的变量。

我的问题如下: 就单元测试最佳实践而言,在这种情况下,这个测试是否足以确认函数 getConfig 是否经过良好测试,或者最好确认每个键都存在于配置文件中。我认为确认所有条目都在配置文件中可能属于另一类测试,但我想确定。

让我知道在这种情况下最佳做法是什么。

基于 gcontrollez 的回答,我意识到最好发布类源代码:

<?php
/**
 * Loads the configuration file
 */

namespace Example\Lib;

class Configuration {

    private static $instance;

    private $arrConfig;

    /**
     * Constructor: loads the config file into property arrConfig and dies if unable
     * to load config file
     * 
     * @return void
     */
    private function __construct()
    {
        $this->arrConfig = parse_ini_file("config/settings.ini", true);
        if ($this->arrConfig == false){
            die("Cannot load configuration file");
        }   
    }

    /**
     * returns an instance of this singleton class
     * 
     * @return Configuration
     */
    public static function getInstance()
    {
        if (self::$instance == null){
            self::$instance = new Configuration();
        }
        return self::$instance;
    }

    /**
     * Getter for the property arrConfig
     *
     * @return array:
     */
    public function getConfig() {
        return $this->arrConfig;
    }   

}

谢谢

【问题讨论】:

    标签: unit-testing phpunit


    【解决方案1】:

    您没有对getConfig 方法进行单元测试。您只是在检查其结果是否包含某些数据。这是完全有效的,可能很有用,但不是单元测试。

    如果您想对getConfig 方法进行单元测试,您应该检查每个可能的config.ini 文件的行为。我想您正在使用getConfig 中的parse_ini_file 函数。因此,为了对getConfig 方法进行单元测试,您应该检查所有您认为可能发生的情况:

    - testConfigFileIsLoaded
    - testExceptionThrownIfConfigFileFailsToLoad
    

    parse_ini_file 返回一个数组或 false,因此您应该检查这些情况。

    为此,您需要能够更改要使用的.ini 文件。如果它在 Configuration 类中被硬编码,你将无法做到这一点。

    【讨论】:

    • 我喜欢你的回答。我检查了我的配置类,当无法加载文件时它只是一个死机。显然,您建议的例外情况要好得多。我去做。关于你关于硬编码配置文件的观点,我通过洞应用程序只使用一个配置文件,如果我不在这个类中硬编码它你有什么建议,把它作为参数放在构造函数中,每个调用代码都应该提供配置文件的名称?那不是不必要的代码耦合吗?还是有更好的方法?我现在发布源类。
    • 如果你想对类进行单元测试,我认为最正确的做法是将 .ini 文件作为参数传递给构造函数,这样你就可以使用任何 @987654332 检查类行为@ 文件。然后,您将在创建 Configuration 类时对文件名进行硬编码。这样您就可以在其他项目中重用该类(及其测试)。最后一点:在测试中,您不应该使用真正的 .ini 文件,而应使用其他或其他适合作为很好示例的文件。
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多