Php 如何测试设置受保护属性的构造函数?
嗯,我是单元测试的新手(使用phpUnit),刚刚开始测试我的一个类 实际构造函数如下所示: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
/**
* Loads configuration.
*/
function __construct() {
$config =
Kohana::$config->load('koffee');
$this->_table_name = $config->table_name;
$this->_table_columns = $config->table_columns;
}
它基本上从另一个文件获取配置,并将其设置为该对象的受保护属性
下面是单元测试的外观(它还没有完成,这就是我需要帮助的地方):
问题是,财产是受保护的,我无法如此轻松地访问它们
我目前看到的可能解决方案:
也许这对你来说很有趣,但是,正如我所说的,我对单元测试是新手。非常感谢您的帮助。我过去使用的一种技术是创建一个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();