Тестирование частного метода в абстрактном классе расширяет другой - PullRequest
3 голосов
/ 18 октября 2011

Я пытаюсь протестировать закрытый метод в абстрактном классе.

У меня есть три абстрактных класса:

abstract class AbstractClass1 extends AbstractClass2
{
   private function _privateFunction()
    {
        //method's body
    }
}

abstract class AbstractClass2 extends AbstractClass3
{
    public function __construct($param)
    {
        parent::__construct($param)
    }
}

abstract class AbstractClass3
{
    public function __construct($param = array()) 
    {
        //something
    }
}

Тестовый класс:

class AbstractClass1Test extends PHPUnit_Framework_TestCase
{
    public function test_privateFunction()
    {
        $stub = $this->getMockForAbstractClass("AbstractClass1");
        $class = new ReflectionClass($stub);
        $method = $class->getMethod("_privateFunction");
        $method->setAccessible(true);

        //some assertings with $method->invoke($stub)
    }
}

Тест не пройден из-за ошибки:

Отсутствует аргумент 1 для AbstractClass2 :: __ construct (), вызывается в /usr/share/php/PHPUnit/Framework/MockObject/Generator.php в строке 190 и определяется

AbstractClass2.php

public function __construct($param)

AbstractClass1.php

$classMock = $this->getMockForAbstractClass("AbstractClass1");

Generator.php: 190

if ($callOriginalConstructor &&
    !interface_exists($originalClassName, $callAutoload)) {
    if (count($arguments) == 0) {
        <strong>$mockObject = new $mock['mockClassName'];</strong>
    } else {
        $mockClass  = new ReflectionClass($mock['mockClassName']);
        $mockObject = $mockClass->newInstanceArgs($arguments);
    }
} else ...

Что я не так делаю?Или как я могу проверить свою личную функцию в этой ситуации?

Ответы [ 2 ]

6 голосов
/ 18 октября 2011

Вам необходимо передать аргумент конструктору AbstractClass1.В качестве второго аргумента передайте аргументы конструктора в массиве getMockForAbstractClass().

$stub = $this->getMockForAbstractClass("AbstractClass1", array('param'));
0 голосов
/ 18 октября 2011

Видя, как вы отвергли оригинальный конструктор,

public function __construct($param = array())  //Allow null $param as it would default to array();

С новым:

public function __construct($param) //Does not allow null $param.

Вам потребуется определить $param при инициализации объекта. Это, вероятно, ваша проблема.

Объекты в PHP не похожи на JavaScript, их нельзя называть ассоциативными массивами. Инициализация вашего объекта должна выглядеть следующим образом:

$mockObject = new ClassExtendingAbstractClass1Or2('parameter');

Ключевое слово new нельзя использовать перед переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...