Я читал здесь несколько вопросов, касающихся использования модульного тестирования для проверки частных методов и свойств. Я новичок в модульном тестировании и хотел бы получить информацию о методе, который я пытаюсь использовать, чтобы мое тестирование могло получить доступ к закрытым/защищенным свойствам и методам.
В тесте, над которым я работал, я хотел подтвердить, что передача определенного параметра объекту приводит к установке свойства. Я использую SimpleTest для обучения модульному тестированию, и мой метод тестирования выглядит следующим образом:
function test__Construction_Should_Properly_Set_Tables() {
$cv = new CVObject( array( 'tables' => $this->standardTableDef ) );
$tables = $cv->tables;
$this->assertEqual( $tables, $this->standardTableDef );
}
Затем я написал метод __get в CVObject следующим образом:
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, сделайте свойство доступным для целей тестирования, но если нет, вызовите ошибку. Это позволяет мне сохранить свойство приватным, но иметь возможность использовать его при тестировании, что будет более важно для меня с конкретным закрытым методом, который я собираюсь начать писать.
Итак, мой вопрос: я упустил что-то действительно плохое здесь и должен избегать этой техники?
debug_backtrace()
— недешевый вызов, и его следует избегать в производственном коде. - person David Harkness   schedule 20.02.2011