2011-03-30 15 views
11

हम निम्नलिखित सरल Mojolicious नियंत्रक बनाया है:हम एक Mojolicious नियंत्रक का परीक्षण कैसे करते हैं?

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; 

हमें करने के लिए, यह अधिक कार्यक्षमता परीक्षण के बजाय इकाई परीक्षण

की तरह है:

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; 

इसी इकाई परीक्षण कुछ ऐसा नज़र नियंत्रक के home विधि को कॉल करने का कोई तरीका है और इसके आउटपुट का परीक्षण करें जिसके लिए Test::Mojo के माध्यम से सर्वर इंस्टेंस प्रारंभ करने की आवश्यकता नहीं है?

उत्तर

20

अपने नियंत्रक के तारों का परीक्षण करने के लिए, निम्न जैसे कोड का उपयोग करें।

हम परिचित फ्रंट पदार्थ के साथ t/pages.t शुरू करते हैं।

use Mojolicious; 
use Test::More; 

अब SampleApp::Pages के एक परीक्षण के उपवर्ग कि render के लिए कॉल रिकॉर्ड बना सकते हैं।

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 }); 
} 

आपका प्रश्न Test::Class इस्तेमाल किया है, ताकि विषय के साथ जारी है।

package Test::SampleApp::Pages; 

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

ध्यान दें कि die कोई तर्क के साथ हाल ही में अपवाद प्रसारित, तो आप [email protected] स्पष्ट रूप से लिखने के लिए नहीं है।

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

setup में, परीक्षण उपवर्ग का दृष्टांत यह एक Mojolicious उदाहरण के लिए कनेक्ट, और लॉगिंग बंद।

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; 
} 

घर परीक्षण में, नियंत्रक का home विधि कॉल और परिणाम का निरीक्षण किया।

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"; 
} 

अंत में, अपने परीक्षण चलाएं।

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

आउटपुट:

$ ./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

अब जब कि तुम यह कैसे करना है देखते हैं, सवाल यह है कि यह सब मुसीबत के लायक है है। नियंत्रक सरल तारों होना चाहिए। इस बात पर विचार करें कि नियंत्रक में कोई जटिलता वास्तव में ऐसे मॉडल में है जहां परीक्षण अधिक सरल है।

+0

मैं 'टेस्ट :: कक्षा' से परिचित नहीं था। इसके लिए नए लोगों के लिए, यह ध्यान देने योग्य है - यह सब मॉड्यूल जैसे 'उप स्टार्टअप: टेस्ट (स्टार्टअप) {...}' को समझने के लिए मॉड्यूल है। – Randall

संबंधित मुद्दे