2010-10-28 2 views
2

Я использую PHP 5.3 и SimpleTest, но более общие ответы приветствуются. Каждый плагин будет классом, который расширяет абстрактный класс ... как я могу проверить, что этот интерфейс работает правильно? Должен ли я создавать несколько плагинов и тестировать их? Или есть более удовлетворительный способ?Как проверить свой подключаемый интерфейс, который использует абстрактный класс?

В качестве примера, представьте себе что-то, чтобы представлять деньги. Пользователи могут расширять это с помощью разных валютных классов.

абстрактный класс Деньги
{
частный статический символ $;
private static $ num_decimals;

общественная функция __construct ($ сумма) {...}
общественная функция __toString() {...}
}

Тогда плагин будет выглядеть следующим образом:

класс GBPound продлевает Деньги
{
частный статический $ symbol = "£";
private static $ num_decimals = 2;
}

Возможно, я мог бы подражать множественное наследование, расширяя класс UnitTest и класс денег, но это может запутаться!

Это так сложно, потому что модульное тестирование касается тестирования интерфейса, но сам класс - это подключаемый интерфейс.

+0

В чем проблема? Почему вы не можете просто проверить класс «GBPound»? – NOtherDev

+0

Потому что я хочу проверить способность сделать класс 'GBPound' или любую другую комбинацию классов. Если у класса есть пользователи в Анголе, я хочу, чтобы они могли использовать интерфейс для создания класса ANKwanza. –

+0

Зачем вам все-таки нужен фунт? GBPound не настолько особенный, что он не мог быть представлен только Money. Просто создайте аргументы $ symbol и $ num_decimals, необходимые конструктору, и сохраните их нестатические. Также вы можете переименовать Money to Currency. – Gordon

ответ

0

Я решил пойти с идеей тестирования интерфейса, создав пустой класс подключаемого модуля. Для меня это кажется намного чище, чем насмешка над абстрактным классом. (Тем не менее, я переношу все свои тесты на PHPUnit по другим причинам.)

1

Не уверен в простоте, но PHPUnit может создавать макеты абстрактных классов, которые позволяют вам тестировать их напрямую.

+0

Спасибо за ответ. Я все еще не совсем уверен, как бы выглядел тест. Статические переменные устанавливаются статически в строке для каждого плагина и не могут быть изменены. Я бы хотел проверить: static :: $ symbol = "£" и static :: $ num_decimals = 2, self :: toString() == "£ 3.24". Единственный способ, которым я могу это сделать, - создать плагин или два, которые предназначены исключительно для тестирования. –

+0

Нет смысла тестировать 'static :: $ symbol =" £ "', поскольку это будет проверять, работает ли сам PHP, что не является вашей работой. Вы должны предположить, что это работает, и что пользователи вашего класса будут правильно его распространять.Ваш тест должен быть сконцентрирован на тестировании метода __toString(), который может быть выполнен либо путем создания «поддельного» плагина, либо с помощью возможности PHPUnit генерировать макеты. – Mchl

+0

Да, вот что я имел в виду. Следовательно, =, а не ==. Должно быть добавлено $ obj-> amount = 3.24 (или независимо от интерфейса). Я посмотрю на PHPUnit. Я решил отказаться от него изначально (это мой первый проект TDD на PHP), потому что я хотел быстро начать работу и PHPUnit выглядел так, будто у него была более крутая кривая обучения, чем SimpleTest. –

Смежные вопросы