LoginSignup
1
0

More than 5 years have passed since last update.

Test::Mojoで、JSONを返すAPIをテストする。

Last updated at Posted at 2014-03-13

Test::Mojoには、jsonをテストするメソッドがあります。
主にjson_isメソッドを使用します。

以下のように、JSON構造をポインタで指定して、値をテストすることができます。

t/base.t
# {"status":"ok"}
$t->get_ok('/case1')
  ->status_is(200)
  ->json_is('/status' => 'ok');


# {
#     "status":"ok",
#     "list":[
#         {
#             "id":1,
#             "name":"太郎"
#         },
#         {
#             "id":2,
#             "name":"花子"
#         },
#         {
#             "id":3,
#             "name":"冴子"
#         }
#     ]
# }
$t->get_ok('/case2')
  ->status_is(200)
  ->json_has('/status')
  ->json_is('/status' => 'ok')
  ->json_is('/list/0/id' => 1)
  ->json_is('/list/0/name' => '太郎')
  ->json_is('/list/1/id' => 2)
  ->json_is('/list/1/name' => '花子')
  ->json_is('/list/2/id' => 3)
  ->json_is('/list/2/name' => '冴子');

JSON全体をテストする場合は、以下のようにPerlのデータ構造でテストすることができます。

t/base.t
# {"status":"ok"}
$t->get_ok('/case1')
  ->status_is(200)
  ->json_is({status => 'ok'});

# {
#     "status":"ok",
#     "list":[
#         {
#             "id":1,
#             "name":"太郎"
#         },
#         {
#             "id":2,
#             "name":"花子"
#         },
#         {
#             "id":3,
#             "name":"冴子"
#         }
#     ]
# }
$t->get_ok('/case2')
  ->json_is({
      status => 'ok',
      list => [
          {
              id   => 1,
              name => '太郎',
          },
          {
              id   => 2,
              name => '花子',
          },
          {
              id   => 3,
              name => '冴子',
          }
      ]
  });

以下、テストコード全体です。

myapp.pl
use Mojolicious::Lite;
use utf8;

my %case = (
    case1 => {
        status => 'ok',
    },
    case2 => {
        status => 'ok',
        list => [
            {
                id   => 1,
                name => '太郎',
            },
            {
                id   => 2,
                name => '花子',
            },
            {
                id   => 3,
                name => '冴子',
            }
        ],
    },
);

get '/:case' => sub {
  my $self = shift;
  $self->render(
      json => $case{$self->param('case')}
  );
};

app->start;
t/base.t
use strict;
use warnings;
use utf8;
use Test::More;
use Test::Mojo;

use File::Basename;

$ENV{MOJO_HOME} = dirname(__FILE__) . '/../';
require "$ENV{MOJO_HOME}/myapp.pl";

my $t = Test::Mojo->new;

$t->get_ok('/case1')
  ->status_is(200)
  ->json_is({status => 'ok'});

$t->get_ok('/case2')
  ->json_is({
      status => 'ok',
      list => [
          {
              id   => 1,
              name => '太郎',
          },
          {
              id   => 2,
              name => '花子',
          },
          {
              id   => 3,
              name => '冴子',
          }
      ]
  });


$t->get_ok('/case1')
  ->status_is(200)
  ->json_is('/status' => 'ok');

$t->get_ok('/case2')
  ->status_is(200)
  ->json_has('/status')
  ->json_is('/status' => 'ok')
  ->json_is('/list/0/id' => 1)
  ->json_is('/list/0/name' => '太郎')
  ->json_is('/list/1/id' => 2)
  ->json_is('/list/1/name' => '花子')
  ->json_is('/list/2/id' => 3)
  ->json_is('/list/2/name' => '冴子');


done_testing;
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0