Есть ли простой способ настроить локальный автономный веб-сервер для тестирования Perl? - PullRequest
1 голос
/ 25 января 2012

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

Ниже приведен пример, который описывает то, что я пытаюсь сделать.Я сократил его до минимума со следующей структурой каталогов:

./MirrorPage.pm
./t/001_get_url.t
./t/test-docroot/test-1.json

Содержимое "./MirrorPage.pm":

package MirrorPage;

use Moose;
use LWP::Simple;
use namespace::autoclean;

sub get_url {

    my ($self, $url_to_get) = @_;

    ### grab the contents of the url
    my $url_data = get($url_to_get);

    ### return the contents.
    return $url_data;

}

__PACKAGE__->meta->make_immutable;

1;

Содержимое" ./t/001_get_url.t ":

#!/usr/bin/perl 

use Modern::Perl;
use Test::More;
use MirrorPage;

    ### Start test www server on port 8123 here ###

my $t = new_ok('MirrorPage', undef, 'Create MirrorPage');

is(
    $t->get_url("http://localhost:8123/test-1.json"), 
    '{ testkey: "testvalue" }',
    "Verify the data."
);

    ### Kill test www server here ###

done_testing();

Содержание" ./t/test-docroot/test-1.json":

{ testkey: "testvalue" }

Цель состоит в том, чтобы начать и убить себя-содержит веб-сервер в соответствующих местах комментариев в "./t/001_get_url.t".Веб-сервер должен обслуживать содержимое каталога «./t/test-docroot» в качестве корня документа.

Учитывая все это: Каков наилучший / самый простой способ настроить автономный веб-сервер для предоставления статических файлов для тестирования в perl?

Ответы [ 6 ]

3 голосов
/ 25 января 2012

Я бы посмеялся над вызовом HTTP в верхней части вашего файла .t (если вы хотите проверить только MirrorPage.pm):

my $mock = new Test::MockObject();
$mock->fake_module( 'LWP::Simple', get => sub { return '{ testkey: "testvalue" }' } );
2 голосов
/ 18 февраля 2012

Я настоятельно рекомендую Mojolicious как отличный способ создания тестового сервера для клиента.Так как Mojolicious просто отображает URL-адрес в вызов подпрограммы, очень легко очень точно контролировать то, что делает сервер, и поэтому вы можете легко проверить такие вещи, как «мой клиент не работает должным образом, если сервер возвращает неверный ответ / плохое содержимое /время вышло".А поскольку очень просто настроить и демонтировать сервер, небольшая хитрость с помощью fork () позволяет сделать тест и настройку сервера живыми в одном и том же тестовом файле.

2 голосов
/ 25 января 2012

LWP может извлекать файлы, поэтому вы можете переписать $url_to_get с http://... на file://....

2 голосов
/ 25 января 2012

Возможно:

В верхней части раскошелиться и создать простой статический файловый сервер, используя HTTP :: Server :: Simple :: Static , а затем внизу завершить дочерний процесс.

1 голос
/ 25 января 2012

Вот что я придумал, используя Net :: HTTPServer .Исходя из идеи, что " Можно задавать вопросы и отвечать на них ", я публикую это здесь для комментариев / рассмотрения.Я сделал следующее:

Сначала создайте новый модуль по адресу: "./t/TestServer.pm".Содержимое этого файла:

package TestServer;

use Moose;
use Net::HTTPServer;
use namespace::autoclean;

has 'server' => (
    is => "rw",
    isa => "Net::HTTPServer",
    default => sub { 
        Net::HTTPServer->new (
            port => 8123,
            docroot => "t/test-docroot"
        )
    }, 
);


sub BUILD {

    my $self = shift;

    ### Spin up the server.
    $self->server->Start();
    $self->server->Process();

}

### Close up the Moose package.
__PACKAGE__->meta->make_immutable;

1;

Затем обновите тестовый файл "./t/001_get_url.t", чтобы использовать его с помощью вилки:

#!/usr/bin/perl 

use Modern::Perl;
use Test::More;
use MirrorPage;

### Fork for the server
my $pid = fork();

### Parent process. Holds the tests.
if($pid) {

    ### Make sure the server has a moment to startup
    sleep(2);

    my $t = new_ok('MirrorPage', undef, 'Create MirrorPage');

    is(
        $t->get_url("http://localhost:8123/test-1.json"), 
        '{ testkey: "testvalue" }',
        "Verify the data."
    );  
}

### Child process. Holds the server.
elsif(defined($pid)) {

    use lib "t/";
    use TestServer;

    my $svr = TestServer->new();

    exit; # Should never get here.

}

### Error out if necessary.
else {
    die "Can not fork child process.";
}


### Kill the server fork.
kill 1, $pid;

done_testing();

Это работаетхорошо для меня.

0 голосов
/ 25 января 2012

Хотя это зависит от ОС, я уверен, что Apache - ваш ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...