Модульное тестирование класса, читающего файл конфигурации

У меня есть класс "Конфигурация", который имеет метод "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;
    }   

}

Спасибо

1 ответ

Решение

Вы не проводите модульное тестирование getConfig метод. Вы просто проверяете, что его результат содержит определенные данные. Это совершенно верно и может быть полезно, но не является модульным тестом.

Если вы хотите провести модульное тестирование getConfig метод, вы должны проверить его поведение с каждым возможным config.ini файл. Я полагаю, вы используете parse_ini_file функция внутри getConfig, Таким образом, для того, чтобы юнит-тест getConfig Метод, вы должны проверить все возможные случаи, которые, по вашему мнению, могут произойти:

- testConfigFileIsLoaded
- testExceptionThrownIfConfigFileFailsToLoad

parse_ini_file возвращает массив или false, так что это те случаи, которые вы должны проверить.

Для этого вам нужно иметь возможность изменить .ini файл для использования. Если это внутри Configuration класс вы не сможете сделать это.

Другие вопросы по тегам