"Невозможно вызвать метод" dir_path "для неопределенного значения" при запуске компонента Mason в командной строке - PullRequest
1 голос
/ 11 ноября 2009

Привет,

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

perl -MHTML::Mason::Request -MHTML::Mason::Interp -I./lib \
-e '$int = HTML::Mason::Interp->new( data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps" ); $m = HTML::Mason::Request->new( comp => "/dummy", interp => $int ); $m->comp("/dummy")'

Результат:

Can't call method "dir_path" on an undefined value at lib/HTML/Mason/Request.pm line 1123.

Ошибка выдается при попытке вызова ->comp. Я не могу понять, что не так с конфигурацией. Компонент есть и, кажется, скомпилирован просто отлично, и он работает через Apache.

Это использует HTML :: Mason 1.35.

Редактировать : Давайте попробуем награду за это. Альтернативой является то, что мне нужно погрузиться глубоко в кишки Мейсона! :)

Отредактируйте снова : Большое спасибо Дэвиду за то, что он указал на важную деталь, которую я упустил, чтобы заставить это работать.

Это было на самом деле для тестовой среды, которая должна была работать с модулем, который вызывает некоторые вычисления Mason - при нормальной работе модуль снабжен объектом запроса Mason для использования с этой целью, но я не мог заставить это работать не в сети. Вместо этого ключ использовал объект Interpreter, поэтому я закончил тем, что сделал следующее, что немного глупо, но заставляет тесты работать:

sub _mason_out { 
   ...
   my $buf;
   if ( $ENV{MASON_TEST} ) { 
       my $int = HTML::Mason::Interp->new( comp_root  => $self->{env}->comp_dir,
                                           out_method => \$buf );

       $int->exec( $comp, %args );
   } else { 
       my $m = $self->{mason_object};
       $m->comp( { store => \$buf }, $comp, %args );
   }

   return $buf;
}

1 Ответ

2 голосов
/ 16 ноября 2009

Я думаю, что это терпит неудачу, потому что ваш объект Request не построил стек компонентов в тот момент, когда он вызывается. Вместо этого используйте метод Interp->exec(), как описано в Использование Мейсона из автономного скрипта

perl -MHTML::Mason::Interp -I./lib \
-e 'HTML::Mason::Interp->new( data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps" )->exec("/dummy")'
...