Фиктивные объекты PHPUnit и статические методы

Я ищу лучший способ пойти о тестировании следующего статического метода (конкретно использующий Модель Доктрины):

class Model_User extends Doctrine_Record
{
    public static function create($userData)
    {
        $newUser = new self();
        $newUser->fromArray($userData);
        $newUser->save();
    }
}

Идеально, я использовал бы фиктивный объект, чтобы гарантировать, что "fromArray" (с пользовательскими данными, которыми снабжают) и "сохранение" назвали, но это не возможно, поскольку метод является статическим.

Какие-либо предложения?

46
задан rr. 1 March 2010 в 15:49
поделиться

2 ответа

Себастьян Бергманн, автор PHPUnit, недавно вел блог сообщение о Статические методы подстановки и имитации . С помощью PHPUnit 3.5 и PHP 5.3, а также последовательного использования позднего статического связывания вы можете выполнить

$class::staticExpects($this->any())
      ->method('helper')
      ->will($this->returnValue('bar'));

Обновление: staticExpect является устаревшим с PHPUnit 3.8 и будет полностью удален позже. версии.

43
ответ дан 26 November 2019 в 20:38
поделиться

Тестирование статических методов обычно считается довольно сложным (как вы, вероятно, уже заметили) , особенно до PHP 5.3.

Не могли бы вы изменить свой код, чтобы не использовать статический метод? На самом деле я не понимаю, почему вы здесь используете статический метод; это, вероятно, можно было бы переписать в какой-нибудь нестатический код, не так ли?


Например, может ли что-то подобное не сработать:

class Model_User extends Doctrine_Record
{
    public function saveFromArray($userData)
    {
        $this->fromArray($userData);
        $this->save();
    }
}

Не уверен, что вы будете тестировать; но, по крайней мере, статического метода больше нет ...

0
ответ дан 26 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: