В настоящее время я использую phpunit
для некоторого модульного тестирования. Из-за наличия некоторых защищенных методов мне пришлось использовать Reflection Class
для изменения видимости этих методов для public
.
Первоначальные методы были вызваны успешно, но каким-то образом он застревает по определенному методу:
Fatal error: Call to undefined method ReflectionClass::create_schema()in
/vagrant/fuelphp/fuel/app/tests/model/repository/jobpost.php on line 54
Однако сброс метода через get_method()
с помощью var_dump
доказывает, что он существует в экземпляре класса:
class ReflectionMethod#2317 (2) {
public $name =>
string(13) 'create_schema'
public $class =>
string(34) 'Model_Repository_Feed'
}
Тогда реальный путаный бит, я решил использовать hasMethod()
чтобы узнать, существует ли метод:
52 echo "If this says 1, class exists: ".$this->_target->hasMethod('create_schema');
53 try {
54 $this->_target->create_schema();
55 }
Результат при запуске говорит: "Да, это существует... но это не так":
If this says 1, class exists: 1
Fatal error: Call to undefined method ReflectionClass::create_schema() in /vagrant/fuelphp/fuel/app/tests/model/repository/jobpost.php on line 54
Чтобы прояснить этот метод является общедоступным и наследуется от abstract
родительского класса:
public function create_schema() {
$this->create_schema_exec(self::$_real_schema_name);
}
Как решить эту проблему?
вам нужно получить объект класса, который содержит метод не объект отражения.
$reflection = new ReflectionClass($className);
$object = $reflection->newInstanceWithoutConstructor();
$object->methodName();
getParentClass()
и он показывает правильный родительский класс