2011-01-06 3 views
1

Я пытаюсь написать тестовый пример, чтобы гарантировать, что класс Singleton не может быть создан. Конструктор Singleton определяется как частное, так мой тест следующим образом:Как ожидать фатальных ошибок с simpletest в php

$this->expectError(); 
$test = new TestSingletonClassA(); 

Вместо того, чтобы ловить ошибку и прохождения теста, я получаю «PHP Фатальная ошибка: Вызов частного Singleton :: __ конструкт (). Я также пробовал передать PatternExpectation в качестве параметра ожидатьError, но это тоже не сработало. Есть ли у вас какие-либо предложения?

Некоторые фона: php5.3, simpletest1.1a

ответ

-1

я не думаю, что это можно сделать это таким образом .. фатальные ошибки не catchable, как я уже понял. вы можете использовать отражение, чтобы получить метод конструктора, а затем убедитесь, что он имеет модификатор доступа «private».

Это трудно проверить на большинстве языков. например, java, C# и C++ даже не позволяли вам компилировать этот код. поэтому он никогда не может быть запущен вообще. D:

+0

Так что, полагаю, для этой ситуации вместо тестовых случаев я должен сосредоточиться на правильном дизайне? В моей реализации Singleton является абстрактным классом, поэтому я хочу, чтобы некоторый способ гарантировать, что подклассы не могут реализовать публичный конструктор, но могут переопределить частный конструктор. Есть ли способ сделать это? –

+0

Я так не думаю .. но есть и другие способы убедиться, что конструктор не вызывается, когда он не должен. один способ будет иметь массив, отслеживающий инстанцированные классы. другой будет использовать debug_stacktrace, чтобы проверить, что стек вызовов приходит из некоторого метода get_instance. обе стратегии будут применяться внутри конструктора базового класса. также, я думаю, вам нужно сделать защищенный конструктор базового класса или конструктор подкласса, вероятно, не сможет вызвать parent :: __ construct – davogotland

0

Если ваш PHP-код вызывает FATAL ERROR, он никогда не попадет на phpunit, поэтому вам нужно написать «правильный» код, чтобы проверить его. Если вы вызовете частный метод, он выкинет excepcion, поэтому он не попадет в phpunit. Вы должны это изменить.

Думаю, вам нужно высмеять объект. Попробуйте these posts по этому вопросу (это серия из 4 сообщений) и these slides (от слайда # 43).

0

Модули тестирования оборудования не могут поймать такие вещи. Но вы можете с PHPT и аналогичными рамками тестирования регрессии.

Возможно, вам придется перепрыгнуть через некоторые обручи, чтобы подключить его к PHPUnit, но, вероятно, есть способы интегрировать его с остальными тестами. Вам просто нужно отделить утверждения и специальный случай, когда вы ожидаете фатальную ошибку.