Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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_Unit Testing_Kohana_Phpunit_Visibility - Fatal编程技术网

Php 如何测试设置受保护属性的构造函数?

Php 如何测试设置受保护属性的构造函数?,php,unit-testing,kohana,phpunit,visibility,Php,Unit Testing,Kohana,Phpunit,Visibility,嗯,我是单元测试的新手(使用phpUnit),刚刚开始测试我的一个类 实际构造函数如下所示: /** * Loads configuration. */ function __construct() { $config = Kohana::$config->load('koffee'); $this->_table_name = $config->table_name; $this->_table_columns = $co

嗯,我是单元测试的新手(使用phpUnit),刚刚开始测试我的一个类

实际构造函数如下所示:

/**
 * Loads configuration.
 */
function __construct() {

    $config =
        Kohana::$config->load('koffee');

    $this->_table_name = $config->table_name;
    $this->_table_columns = $config->table_columns;

}
它基本上从另一个文件获取配置,并将其设置为该对象的受保护属性

下面是单元测试的外观(它还没有完成,这就是我需要帮助的地方):

问题是,财产是受保护的,我无法如此轻松地访问它们

我目前看到的可能解决方案:

  • 更改属性的可见性(我不喜欢这样)
  • 在类I测试中添加所谓的“getter”——而不是单元测试(我也不喜欢这个)
    也许这对你来说很有趣,但是,正如我所说的,我对单元测试是新手。非常感谢您的帮助。

    我过去使用的一种技术是创建一个Tester类,该类公开适当的方法来测试对象。在这种情况下,
    Model\u Article\u Tester
    将继承
    Model\u Article
    并公开一个
    get
    方法。这里的好处是,您可以在不影响生产代码的情况下公开测试所需的数据。

    您可以创建一个子类来公开所需的数据,并且只用于单元测试


    您还可以测试类的行为,而不是数据。Model_文章必须对table_名称和table_列进行处理,以便测试该行为。例如,如果模型文章用于创建html表,那么您可以设置配置值,创建模型文章,使用它创建html,然后断言它匹配硬编码字符串,如
    col1col2单元测试是关于单元测试。受保护的成员不是单元的公共接口的一部分,这是编写单元测试时需要注意的全部内容

    您不需要测试一个单元的内部结构,但它可以按预期工作

    如果不管您想做什么,都可以使用和检查对象的受保护/私有属性,或者执行对象的受保护/私有方法


    另请参见:

    您可以尝试使用


    谢谢这似乎是一种方法。您还没有编写实际要测试的内容,以及您认为存在问题的原因。我想将对象的受保护属性与测试中编写的本地
    $config
    进行比较。您能给我一个构造函数注入的示例吗,请?构造函数中需要的所有参数都是构造函数的参数:
    function\uu-construct($table\u name,$table\u columns)
    。然后,创建者服务可以使用注入的配置实例化所需的类,而不需要类知道如何完成配置,创建者知道哪些选项可用于配置。这意味着我需要从类中单独加载该配置,然后将其传递给构造函数(
    newmodel\u文章('x','y')
    )?在真实世界的代码中,是的,这可能是您将要做的。但是在单元测试中,您可以传递自己的值,并确保您只测试模型文章是否按预期工作,并且您不必担心配置。这也使模型文章更具可预测性,因为您知道它只依赖于其输入和输出非隐藏值。(相关):-相同的一般答案,更多的代码示例和动机+1@edorian:感谢您留下链接,非常感谢您的博学知识。
    /**
     * Tests that config is loaded and correct.
     */
    function testConfigIsLoadedAndCorrect() {
    
        $object = new Model_Article();
    
        $config = Kohana::$config->load('koffee');
    
        // Compare object's **protected** properties to local `$config`. How?!
    
    }
    
    $reflector = new ReflectionClass('Model_Article');
    $object = $reflector->newInstanceWithoutConstructor();