Я пытаюсь написать тест для очень старого кода, который мы используем с помощью PHPUnit. Я дал здесь приблизительную структуру, я пытаюсь протестировать метод isMember () класса B, который он наследует от ClassA. Нужно просто проверить, существует ли в классе постоянное значение.
Проблема, с которой я столкнулся, заключается в том, что это, очевидно, защищенный конструктор, поэтому я не знаю, как это проверить, так как я получаю защищенные конструктивные ошибки в PHPUnit, поскольку, очевидно, конструктор защищен. Посоветуйте пожалуйста, как мне это проверить?
abstract class ClassA implements InterfaceA {
private $mValueList;
protected static $instance;
protected function __construct() {
}
protected static function getInstance(ClassA $obj) {
if (is_null($obj->instance)) {
$obj->instance = $obj;
}
return $obj->instance;
}
public function isMember($value) {
return isset($this->mValueList[$value]);
}
....more methods......
}
class ClassB extends ClassA {
public static function getInstance() {
return parent::getInstance(new self());
}
const CON1 = 'string1';
const CON2 = 'string2';
}
Вы бы протестировали его, как любой другой класс, вы просто не используете конструктор в тесте.
public function testIsMember() {
$classB = ClassB::getInstance();
$this->assertTrue($classB->isMember('string1'));
$this->assertFalse($classB->isMember('foo'));
}
Я делаю предположение об утверждениях, и вы могли бы реорганизовать тест для использования поставщика данных. Но общая идея та же самая. Вы не вызываете конструктор непосредственно в ваших тестах для синглтона. getInstance
Метод заменяет вызов конструктора.
Других решений пока нет …