[Kiev-pm] Данные из конфига считываются с позиции предыдущего обхода (mojolicious)

Cyrill Novgorodcev cynovg at gmail.com
Sat Oct 27 13:27:29 PDT 2012


Здравствуйте.

Написал небольшое тестовое приложение,что бы объяснить свою проблему.

основной модуль приложения lib/SmallTest.pm

package SmallTest;
use Mojo::Base 'Mojolicious';

sub startup {
  my $self = shift;

  $self->plugin( 'Config' );

  my $r = $self->routes;
  $r->get('/')->to('example#welcome');
}

1;

и контроллер lib/SmallTest/Example.pm

package SmallTest::Example;
use Mojo::Base 'Mojolicious::Controller';
#use Data::Dumper;

sub welcome {
  my $self = shift;
  my $test = 0;
#  $self->app->log->debug( Dumper( $self->config->{ test } ) );
  while ( my ( $key, $val ) = each %{ $self->config->{ test } } ) {
    if ( $test =~ $key ) {
        $test = $val;
        last;
    }
  }
  $self->render( message => $test );
}

1;

файл конфига small_test.conf:

{
  test => {
    0 => 'x00',
    1 => 'x11',
    2 => 'x22',
  },
}

шаблон вывода templates/example/welcome.html.epl

% layout 'default';
<h2><%= $message %></h2>

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

В качестве костыля достаточно выводить дамп в лог (раскомментировать
строки) и все чудесным образом начинает работать так, как и
задумывалось. Если запускать приложение в cgi-окружении, то проблема
не возникает. Но, даже банальный тест (см ниже) не проходит, т.к.
используется внутренний сервер.

тест-файл t/01-def.t

use strict;
use warnings;

use Test::More 'no_plan';
use Test::Mojo;

my $t = Test::Mojo->new( 'SmallTest' );
$t->get_ok('/')->status_is(200)->text_is( 'h2' => 'x00' );
$t->get_ok('/')->status_is(200)->text_is( 'h2' => 'x00' );

Теперь, собственно, вопрос: это нормальное поведение?

PS: Тестовое приложение можно взять на гитхабе
git clone https://github.com/cynovg/SmallTest

-- 


Всего хорошего!


More information about the Kiev-pm mailing list