2013-07-20 7 views
2

Контекст:Как я могу использовать Test :: More и друзей для автоматического тестирования унаследованного поведения?

Скажем, у меня есть несколько модулей, которые наследуют друг от друга (с использованием старой школы наследования с base и parent, не Moose или аналогичный). Foo::Bar наследует Foo и Foo::Bar::Baz наследует Foo::Bar. Все эти модули имеют тестовые наборы, написанные с помощью Test::More. Набор тестов для дочернего класса проверяет только те методы, которые он реализует. Классы для детей не обязательно переопределяют все методы у их родителей, хотя они могут добавлять новые методы, которых у их родителя нет.

Вопрос:

Есть ли какие испытания рамки, техник, или Test::More особенности, с которой я могу писать тесты, которые будут не только тест подкласса конкретного поведения, но и затем запустить тестовые наборы для любого унаследованного поведения/родительские классы? В основном, я ищу что-то, что позволяет мне писать тесты для уникального/специального поведения подкласса, но также будет проверять и следить за тем, чтобы подкласс вел себя в тестах так же, как ожидается, что его родительский класс ,

Что я пробовал:

Я написал очень простой тест упряжь с методом генератора, который строит экземпляр модуля строки выбранных и проходит испытания против него в зависимости от того, какого типа модуля (есть центральный хеш, который отслеживает иерархию подкласса/суперкласса), но это кажется грубым. Я предполагаю, что (как и большинство вещей, которые мне нужно делать в Perl), кто-то еще сделал это гораздо более элегантным и надежным способом.

ответ

2

Что вы ищете, это Test::Class.

Вы можете сделать тестовый класс для Foo::Bar, который я бы назвал Test::Foo::Bar. Этот модуль Perl будет использовать Test::Class в качестве базового класса. Но вместо того, чтобы испытывать Foo::Bar непосредственно, доступ к нему через метод:

sub class {'Foo::Bar'} 

Это позволяет переопределить его позже.

Затем вы создаете новый испытательный класс, Test::Foo::Bar::Baz который наследует от Test::Foo::Bar. Делая это, вы автоматически унаследовали все тесты, которые вы написали для родительского класса. Конечно, вам необходимо переопределить класс():

sub class {'Foo::Bar::Baz'} 

Voila! Теперь вы выполняете все свои тесты с Test::Foo::Bar по телефону Foo::Bar::Baz, и вы можете переопределить или сделать новые тесты в своем сердце.

хроматической имеет тщательный пример на своем блоге: Resuing Test Code with Test::Class

И вы правы насчет испытаний жгутов уже существующих. Смесь Test::Class, Test::Harness и prove должна заботиться о ваших потребностях, и есть очень мало оснований писать свои собственные.