DOKK / manpages / debian 10 / libdancer2-perl / Dancer2::Manual::Testing.3pm.en
Dancer2::Manual::Testing(3pm) User Contributed Perl Documentation Dancer2::Manual::Testing(3pm)

Dancer2::Manual::Testing - Writing tests for Dancer2

version 0.207000

Since Dancer2 produces PSGI applications, you can easily write tests using Plack::Test and provide your Dancer application as the app for testing.

A basic test (which we also scaffold with dancer2) looks like this:

    use strict;
    use warnings;
    use Test::More tests => 4;
    use Plack::Test;
    use HTTP::Request::Common;
    use_ok('MyApp');
    # create an application
    my $app = MyApp->to_app;
    isa_ok( $app, 'CODE' );
    # create a testing object
    my $test = Plack::Test->create($app);
    # now you can call requests on it and get responses
    # requests are of HTTP::Request
    # responses are of HTTP::Response
    # "GET" from HTTP::Request::Common creates an HTTP::Request object
    my $response = $test->request( GET '/' );
    # same as:
    # my $response = $test->request( HTTP::Request->new( GET => '/' ) );
    ok( $response->is_success, 'Successful request' );
    is( $response->content, 'OK', 'Correct response content' );

Read the documentation for HTTP::Request and HTTP::Request::Common to see the different options for sending parameters.

If you don't want to use an entire user agent for this test, you can use HTTP::Cookies to store cookies and then retrieve them:

    use strict;
    use warnings;
    use Test::More tests => 3;
    use Plack::Test;
    use HTTP::Request::Common;
    use HTTP::Cookies;
    use_ok('MyApp');
    my $url  = 'http://localhost';
    my $jar  = HTTP::Cookies->new();
    my $test = Plack::Test->create( MyApp->to_app );
    subtest 'Create session' => sub {
        my $res = $test->request( GET "$url/login" );
        ok( $res->is_success, 'Successful login' );
        # extract cookies from the response and store in the jar
        $jar->extract_cookies($res);
    };
    subtest 'Check session' => sub {
        my $req = GET "$url/logout";
        # add cookies to the request
        $jar->add_cookie_header($req);
        my $res = $test->request($req);
        ok( $res->is_success, 'Successful logout' );
        like(
            $res->content,
            'Successfully logged out',
            'Got correct log out content',
        );
    };

Please note that the request URL must include scheme and host for the call to "add_cookie_header" in HTTP::Cookies to work.

In order to test plugins, you can create an application on the spot, as part of the test script code, and use the plugin there.

    use strict;
    use warnings;
    use Test::More tests => 2;
    use Plack::Test;
    use HTTP::Request::Common;
    {
        package MyTestApp;
        use Dancer2;
        use Dancer2::Plugin::MyPlugin;
        get '/' => sub { my_keyword };
    }
    my $test = Plack::Test->create( MyTestApp->to_app );
    my $res  = $test->request( GET '/' );
    ok( $res->is_success, 'Successful request' );
    is( $res->content, 'MyPlugin-MyKeyword', 'Correct content' );

Dancer Core Developers

This software is copyright (c) 2018 by Alexis Sukrieh.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

2018-12-23 perl v5.28.1