Тестирование метода автозагрузки с помощью Test::More

У меня есть фабричный класс, который предоставляет кучу подобных методов с помощью автозагрузки. Для более длинного списка различных типов объектов он может делать такие вещи, как

Factory->objects();
Factory->object(23);
Factory->object(name => "foo");

Теперь я хочу написать тест для этого класса. Я начал с чего-то вроде этого:

use Test::More;

BEGIN { use_ok 'Factory' }

my $objects = Factory->objects;

# more tests following ...

Тест не пройден в строке с Factory->objects, потому что он неявно проверяет, может ли Factory выполнить objects(). Я не смог найти документацию для этого. Но если я запускаю тот же вызов в сценарии без тестирования, он работает отлично.

Как это проверить?

Обновление: ARGH, я только что осознал, что проверил все это для класса модели Factory в своем приложении Catalyst. Что ж, этот класс модели является адаптером для класса Factory в моей внешней модели (которую я на самом деле намеревался протестировать). Работа идеально подходит для самой модели. Еще было бы полезно узнать, как протестировать метод из адаптированного класса. Вот как выглядит класс адаптера:

package MyCatalystApp::Model::Factory;
use Moose;

extends 'Catalyst::Model';
extends 'Catalyst::Model::Adaptor';

__PACKAGE__->config(class => 'MyModel::Factory');

MyModel::Factory — это тот же класс, что и Factory в исходном вопросе. Я пропустил разницу между Catalyst и моделью в исходном вопросе для упрощения.


person Daniel Böhmer    schedule 22.11.2011    source источник


Ответы (2)


Вы должны просто добавить "use Factory;" перед вызовом тестов (после use_ok).

person DVK    schedule 22.11.2011
comment
В качестве примечания: я почти уверен, что это сработает, но, основываясь на моих ограниченных, но нетривиальных знаниях о Test::More, я не могу понять, ПОЧЕМУ use_ok не будет хорошо работать с AutoLoader. Я надеюсь, что кто-то с большим количеством подсказок (Шверн?) Может добавить более точный ответ. - person DVK; 22.11.2011
comment
Я проверил это, и это не сработало для меня. ATM Я пытаюсь создать короткий пример кода, чтобы воспроизвести проблему. - person Daniel Böhmer; 22.11.2011
comment
Теперь тесты работают, и ваш совет действительно не имеет никакого значения. - person Daniel Böhmer; 22.11.2011
comment
@halo - теперь ЭТО имеет гораздо больше смысла (как я отметил в первом комментарии) - person DVK; 22.11.2011

Catalyst создает модели (компоненты) во время setup_components, вызывая метод COMPONENT. Я предполагаю, что Catalyst::Model::Adaptor полагается на это.

Когда вы use MyCatalystApp::Model::Factory, вы можете обойтись без вызова my $factory = MyCatalystApp::Model::Factory->COMPONENT() из тестов вместо new(), чтобы заставить их работать.

person lilphil    schedule 28.06.2013