Как я могу использовать Test::More и друзей для автоматического тестирования унаследованного поведения?
Контекст:
Скажем, у меня есть несколько модулей, которые наследуются друг от друга (используя наследство старой школы с base
а также parent
не лось или подобное). Foo::Bar
наследуется Foo
, а также Foo::Bar::Baz
наследуется Foo::Bar
, Все эти модули имеют тестовые наборы, написанные с Test::More
, Набор тестов для дочернего класса проверяет только те методы, которые он реализует. Дочерние классы не обязательно переопределяют все методы своих родителей, хотя они могут добавлять новые методы, которых нет у их родителей.
Вопрос:
Есть ли какие-то рамки тестирования, техника или Test::More
функция, с помощью которой я могу писать тесты, которые будут не только тестировать поведение подкласса, но также будут запускать тестовые наборы для любых унаследованных поведенческих / родительских классов? По сути, я ищу что-то, что позволило бы мне написать тесты для уникального / специального поведения подкласса, но также проверит и убедится, что подкласс ведет себя в тестах так же, как ожидается, что его родительский класс (ы),
Что я пробовал:
Я написал очень простой тестовый комплект с методом генератора, который создает экземпляр указанного в строке модуля и запускает тесты для него в зависимости от того, какой тип модуля был запрошен (есть центральный хеш, который отслеживает иерархию подкласса / суперкласса), но это кажется грубым. Я предполагаю, что (как и большинство вещей, которые мне нужно сделать в Perl), кто-то другой уже сделал это гораздо более элегантно и надежно.
1 ответ
То, что вы ищете, это Test::Class
,
Вы можете сделать тестовый класс для Foo::Bar
который я бы назвал Test::Foo::Bar
, Этот модуль Perl будет использовать Test::Class
как его базовый класс. Но вместо тестирования Foo::Bar
напрямую, доступ к нему через метод:
sub class {'Foo::Bar'}
Это позволяет нам переопределить это позже.
Затем вы делаете новый тестовый класс, Test::Foo::Bar::Baz
который наследует от Test::Foo::Bar
, Делая это, вы автоматически наследуете все тесты, которые вы написали для родительского класса. Конечно, вам нужно переопределить class():
sub class {'Foo::Bar::Baz'}
Вуаля! Теперь вы запускаете все свои тесты из Test::Foo::Bar
на Foo::Bar::Baz
и вы можете переопределить или сделать новые тесты для вашего сердца.
Chromatic имеет подробный пример в своем блоге: Resuing Test Code с помощью Test::Class
И вы правы насчет уже существующих тестовых ремней безопасности. Смесь Test::Class
, Test::Harness
, а также prove
должен позаботиться о ваших потребностях, и есть очень мало причин, чтобы написать свои собственные.