gpt4 book ai didi

PHP 重载单元测试私有(private)属性和方法

转载 作者:可可西里 更新时间:2023-11-01 12:33:54 27 4
gpt4 key购买 nike

我在这里阅读了一些关于使用单元测试来测试私有(private)方法和属性的问题。我是单元测试的新手,希望输入我正在尝试的方法,以便我的测试可以访问私有(private)/ protected 属性和方法。

在我进行的测试中,我想确认将特定参数传递给对象会导致设置属性。我正在使用 SimpleTest 进行单元测试教育,我的测试方法如下:

function test__Construction_Should_Properly_Set_Tables() {
$cv = new CVObject( array( 'tables' => $this->standardTableDef ) );
$tables = $cv->tables;
$this->assertEqual( $tables, $this->standardTableDef );
}

然后我在CVObject中写了一个__get方法如下:

function __get( $name ) {
$trace = debug_backtrace();
$caller = $trace[1];
$inTesting = preg_match( '/simpletest/', $caller['file'] );

if ( $inTesting ) {
return $this->$name;
} else {
trigger_error( 'Cannot access protected property CVObject::$' .
$name . ' in ' . $trace[0]['file'] . ' on line ' .
$trace[0]['line'],
E_USER_NOTICE );
}
}

我的想法是,如果调用文件来自 SimpleTest,则继续并使该属性可用于测试目的,但如果不是,则触发错误。这使我能够将属性保持私有(private),但能够在测试中使用它,这对于我即将开始编写的特定私有(private)方法来说更为重要。

所以,我的问题是,我是否遗漏了一些非常糟糕的东西并且应该避免这种技术?

最佳答案

如果您发现自己陷入困境并且只是必须访问私有(private)/ protected 属性以启用全面测试,请至少将启用访问的代码放在您的测试或测试框架中。在生产代码中嵌入仅测试代码 a) 使设计复杂化,b) 添加更多必须测试的代码,c) 意味着代码在生产中的运行方式不同。

您可以对 protected 属性使用 Ken 的子类方法,但如果您需要访问 private 并且在 PHP 5.3.2+ 上,您可以使用反射。

function test__Construction_Should_Properly_Set_Tables() {
$cv = new CVObject( array( 'tables' => $this->standardTableDef ) );
$tables = self::getPrivate($cv, 'tables');
$this->assertEqual( $tables, $this->standardTableDef );
}

static function getPrivate($object, $property) {
$reflector = new ReflectionProperty(get_class($object), $property);
$reflector->setAccessible(true);
return $reflector->getValue($object);
}

请注意,getPrivate() 不会像为从父类(super class)继承的属性编写的那样工作,但循环层次结构以找到声明类并不难。

关于PHP 重载单元测试私有(private)属性和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050066/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com