2011-03-30 21 views
11

Aşağıdaki basit Mojolicious denetleyicisi oluşturduk: Bizim içinMojolicious kontrol cihazını nasıl test ederiz?

package Test::SampleApp::Pages; 

# $Id$ 

use strict; 
use warnings; 

our $VERSION = '0.01'; 

use Carp; 
use English '-no_match_vars'; 
use Readonly; 
use Test::Mojo; 
use Test::Most; 

use base 'Test::Class'; 

Readonly my $SERVER_OK => 200; 

sub startup : Tests(startup) { 
    eval { 
     require SampleApp; 

     SampleApp->import; 

     1; 
    } or Carp::croak($EVAL_ERROR); 

    return; 
} 

sub get_home : Tests(4) { 
    my $test = shift; 
    my $mojo = $test->mojo; 

    $mojo->get_ok('/pages/home')->status_is($SERVER_OK); 

    $mojo->text_is(
     'title', 
     $test->base_title . ' | Home', 
     '... and should have the right title' 
    ); 

    $mojo->content_like(
     qr/<body>(?:\s*\S+\s*)+<\/body>/msx, 
     '... and should have a non-blank body' 
    ); 

    return; 
} 

sub get_contact : Tests(3) { 
    my $test = shift; 
    my $mojo = $test->mojo; 

    $mojo->get_ok('/pages/contact')->status_is($SERVER_OK); 

    $mojo->text_is(
     'title', 
     $test->base_title . ' | Contact', 
     '... and should have the right title' 
    ); 

    return; 
} 

sub get_about : Tests(3) { 
    my $test = shift; 
    my $mojo = $test->mojo; 

    $mojo->get_ok('/pages/about')->status_is($SERVER_OK); 

    $mojo->text_is(
     'title', 
     $test->base_title . ' | About', 
     '... and should have the right title' 
    ); 

    return; 
} 

sub base_title { 
    my ($self, $base_title) = @_; 

    if (defined $base_title) { 
     $self->{base_title} = $base_title; 
    } 

    return $self->{base_title}; 
} 

sub mojo { 
    my ($self, $mojo) = @_; 

    if (defined $mojo) { 
     $self->{mojo} = $mojo; 
    } 

    return $self->{mojo}; 
} 

sub setup : Tests(setup) { 
    my $test = shift; 

    $test->base_title('Mojolicious Sample App'); 

    $test->mojo(Test::Mojo->new(app => 'SampleApp', max_redirects => 1)); 

    return; 
} 

1; 

, bu daha

işlevselliği testi yerine birim test gibidir: aşağıdaki gibi

package SampleApp::Pages; 

# $Id$ 

use strict; 
use warnings; 

our $VERSION = '0.01'; 

use Mojo::Base 'Mojolicious::Controller'; 

sub home { 
    my $self = shift; 

    $self->render('title' => 'Home'); 

    return; 
} 

sub contact { 
    my $self = shift; 

    $self->render('title' => 'Contact'); 

    return; 
} 

sub about { 
    my $self = shift; 

    $self->render('title' => 'About'); 

    return; 
} 

1; 

karşılık gelen birim testlerinin

bakmak Denetleyicinin home yöntemini çağırmanın ve Test::Mojo aracılığıyla bir sunucu örneği başlatmayı gerektirmeyen çıktısını test etmenin bir yolu var mı?

cevap

20

Denetleyicinizin kablolarını test etmek için, aşağıdaki gibi bir kod kullanın.

t/pages.t, bilinen ön konularla başlıyoruz.

use Mojolicious; 
use Test::More; 

Şimdi render çağrıları kaydeder SampleApp::Pages bir test alt sınıfını oluşturur.

package TestingPages; 
use Mojo::Base 'SampleApp::Pages'; 

has 'render_called'; 
has 'render_arg'; 

sub render { 
    my($self,%arg) = @_; 
    $self->render_called(1); 
    $self->render_arg({ %arg }); 
} 

Sorunuz Test::Class kullanılan, böylece tema ile devam ediyor. Açıkça [email protected] yazmak zorunda kalmamak için bağımsız değişken olmadan die En son istisna biçimde yayıldığını

package Test::SampleApp::Pages; 

use base 'Test::Class'; 
use Test::More; 

Not. setup yılında

sub startup : Test(startup) { 
    eval { require SampleApp::Pages; SampleApp::Pages->import; 1 } or die; 
} 

, test alt sınıf örneğini bir Mojolicious örneğine bağlanmak ve günlüğünü kapatmak. Ev testinde

sub setup : Test(setup) { 
    my($self) = @_; 

    my $c = TestingPages->new(app => Mojolicious->new); 
    $c->app->log->path(undef); 
    $c->app->log->level('fatal'); 
    $self->{controller} = $c; 
} 

, kontrolörün home yöntemini çağırın ve sonuçları inceleyin.

sub home : Tests(2) { 
    my($self) = @_; 
    my $c = $self->{controller}; 
    $c->home; 
    is $c->render_called, 1, "render called"; 
    is $c->render_arg->{title}, "Home", "correct title arg"; 
} 

Son olarak, testlerinizi çalıştırın.

package main; 
Test::SampleApp::Pages->runtests; 

Çıktı: bunu yapmak için nasıl gördükleri Şimdi

$ ./sampleapp.pl test 
Running tests from '/tmp/sampleapp/t'. 
t/pages.t .. ok 
All tests successful. 
Files=1, Tests=2, 1 wallclock secs (0.03 usr 0.02 sys + 0.24 cusr 0.03 csys = 0.32 CPU) 
Result: PASS

, soru tüm sorun değer olup olmadığıdır. Kontrolörler basit kablolama olmalıdır. Bir denetleyicideki herhangi bir karmaşıklığın gerçekten testin çok daha basit olduğu bir modele ait olup olmadığını düşünün.

+0

"Test :: Class" ile aşina değildim. Bunun için yeni olanlar için, dikkat etmek gerekir - bu alt başlangıç: Test (başlangıç) {...} 'gibi deyimleri anlamak için bakmak için modül. – Randall

İlgili konular