ãã¹ãé§åéçºã®ããã
hachiojipmã«è¡ã£ã¦ããã®ã§ãã#4ã§ã#5ã§ãTestãæ¸ãã®ãé£ããã¨ãã声ãèãããã®ã§ããã¹ãã¯æ¸ãã¦ã¿ãã¨ç°¡åãããã¹ããããã¨éçºã楽ãã¨ããäºãä¼ãã¦ã¿ããã¨åªåãã試ã¿ã§ãã
ã¨ãããã¨ã§ãµã³ãã«ã³ã¼ããæ¸ãã¦ã¿ã¾ããã
https://github.com/okamuuu/Sample-Plack-Test
ç´¹ä»ãããµã³ãã«ã³ã¼ãã«ã¤ãã¦
ããã§ç´¹ä»ãã¦ããã¹ã¯ãªããã¯ããç·ãBlogãä½ããã¨æã£ããã©ãããããããã¨ããªãã®ã§ä¿ºä¿ºWaFãã¤ãã£ã¦ãããã¨ãã¦å®éã«ãã£ããã¹ãé§åéçºã§ãã
ããããã«t/web.tã¨ãã¤ãã£ã¦ã¿ã
æåã«ãã¹ããæ¸ãã¦ã¿ã¾ãããã
#!/usr/bin/env perl use strict; use warnings; use Test::Most; use Plack::Test; use HTTP::Request::Common qw/GET POST/; my $app = sub { return [ 200, [ "Content-Type" => "text/plain", "Content-Length" => 31 ], ["hello, I'm okamuuu. Thank you!!"] ]; }; test_psgi $app, sub { my $cb = shift; my $res = $cb->( GET "/" ); is $res->code, 200; is $res->header('Content-Type'), 'text/plain'; is $res->content, "hello, I'm okamuuu. Thank you!!"; }; done_testing();
ãã¹ãå®è¡ããã¡ããæå
% prove -vl t/web.t t/web.t .. ok 1 ok 2 ok 3 1..3 ok All tests successful.
t/web.tãæ¸ãæãã
ã§ã¯å®éã«code-refãè¿ãã·ã³ãã«ãªä¿ºã
WaFãã¤ãã£ã¦ã¿ã¾ãããã
以ä¸ã®ããã«ã¡ãã£ã¨æ¸ãæãã¾ãã
#!/usr/bin/env perl use strict; use warnings; use Test::Most; use Plack::Test; use HTTP::Request::Common qw/GET POST/; use_ok('MyApp::Web::Handler'); my $app = MyApp::Web::Handler->app(); test_psgi $app, sub { my $cb = shift; my $res = $cb->( GET "/" ); is $res->code, 200; is $res->header('Content-Type'), 'text/plain'; is $res->content, "hello, I'm okamuuu. Thank you!!"; }; done_testing();
ãã¹ãå®è¡ããã¡ãã失æ
:!prove -vl t/web.t t/web.t .. not ok 1 - use MyApp::Web::Handler; <çç¥>
lib/MyApp/Web/Handler.pmã追å
ã¾ãã¯use_okã®ãã¹ããéãã¦ã¿ã¾ãããã以ä¸ã®ããã«useã§ããã ãã®ããã±ã¼ã¸ãã¤ããã¾ãã
package MyApp::Web::Handler; use strict; use warnings; 1;
ãã¹ãå®è¡ãuse_okã¯ã§ãã¦ããã®ã§ãããdone_testingã«å°éããã¾ãã«ããã°ã©ã ãdieãã¦ãã¾ããã¾ããããªã¡ã½ãããªãã§ãããããã
:!prove -vl t/web.t t/web.t .. ok 1 - use MyApp::Web::Handler; Can't locate object method "app" via package "MyApp::Web::Handler" at t/web.t line 21. # Tests were run but no plan was declared and done_testing() was not seen. <çç¥>
lib/MyApp/Web/Handler.pmã«ã¡ã½ããã追å
code-refãè¿ãã¡ã½ããã追å ãã¦ããã¾ãã
package MyApp::Web::Handler; use strict; use warnings; sub app { return sub { [ 200, [ "Content-Type" => "text/plain", "Content-Length" => 31 ], ["hello, I'm okamuuu. Thank you!!"] ]; }; } 1;
ãã¹ãå®è¡ãæåãã¾ãããããªãã¹ãã§ãéãã¨æ°åããããªãã¾ãã
:!prove -vl t/web.t t/web.t .. ok 1 - use MyApp::Web::Handler; ok 2 ok 3 ok 4 1..4 ok All tests successful.
ãã¹ããããã°å®å¿ãã¦æ¹ä¿®ã§ãã¾ãã
MyApp::Web::Handler->appãè¿ãcode-refã¯Plackããããã·ã¥ãªãã¡ã¬ã³ã¹ãåãåã£ã¦ãã¾ãã
ãã®ããã·ã¥ãªãã¡ã¬ã³ã¹ããã¦ã¼ã¶ã¼ãä½ãè¦æ±ãã¦ããã®ãèªã¿è§£ããã¨ã«ãªãã¾ãã
ãªã®ã§ããMyApp::Web::Handlerã¯ãã¾ããã«é åãªãã¡ã¬ã³ã¹ãè¿ãã¦ãã¾ããã¡ãã£ã¨æ¹é ãã¾ãã
package MyApp::Web::Handler; use strict; use warnings; use Plack::Request; sub app { return sub { my $env = shift; my $request = Plack::Request->new($env); my $response = $request->new_response(200); $response->content_type('text/plain'); $response->body("hello, I'm okamuuu. Thank you!!"); return $response->finalize(); }; } 1;
ãã¹ãå®è¡ãæåãã¾ããããã¹ããããã°ã³ã¼ããæ¸ãç´ããå¾ã®ãã§ãã¯ãæ©ãã¦ä¾¿å©ã§ããã
:!prove -vl t/web.t t/web.t .. ok 1 - use MyApp::Web::Handler; ok 2 ok 3 ok 4 1..4 ok All tests successful.
ãéã¼ããã¨è¨ãã° ãéã¼ããã¨çã ã好ããã¨è¨ãã° ã好ããã¨çããã
ãã¾ã®ã¾ã¾ã ã¨ãéã¼ããã¨è¨ã£ã¦ãã好ããã¨è¨ã£ã¦ããã°ããã£ã¦è¨ã£ã¦ãå ¨é¨ããã£ããããokamuuuããããã¨ã!!ãã¨ããçãã¾ããã
ã¨ãããããã¾ãããã¨è¨ãããããã¾ãã!!ãã£ã¦è¿äºããããã«ãã¾ãããããã¹ããæ¸ãæãã¾ãã
#!/usr/bin/env perl use strict; use warnings; use Test::Most; use Plack::Test; use HTTP::Request::Common qw/GET POST/; use_ok('MyApp::Web::Handler'); my $app = MyApp::Web::Handler->app(); test_psgi $app, sub { my $cb = shift; my $res = $cb->( GET "/" ); is $res->code, 200; is $res->header('Content-Type'), 'text/plain'; is $res->content, "hello, I'm okamuuu. Thank you!!"; }; test_psgi $app, sub { my $cb = shift; my $res = $cb->( GET "/bye" ); is $res->code, 200; is $res->header('Content-Type'), 'text/plain'; is $res->content, "bye bye!!"; }; done_testing();
ãã¹ããå®è¡ããã¨ãã£ã±ã失æãã¦ãã¾ãã¾ããã
:!prove -vl t/web.t t/web.t .. ok 1 - use MyApp::Web::Handler; ok 2 ok 3 ok 4 ok 5 ok 6 not ok 7 # Failed test at t/web.t line 27. # got: 'hello, I'm okamuuu. Thank you!!' # expected: 'bye bye!!' 1..7 # Looks like you failed 1 test of 7.
ãµãããã
ã¦ã¼ã¶ã¼ã®ãªã¯ã¨ã¹ãã«å¿ãã¦ã©ã®ã¡ã½ãããå¼ã¹ã°ããã®ãå¤å®ããå¦çãæ¸ãã°è¯ãæ°ããã¾ãããªãããããªã®ãã¤ããã¾ã*1;
MyApp::Web::Handlerãä½æãã¾ãã
package MyApp::Web::Handler; use strict; use warnings; use MyApp::Web::Router::Sinatraish; use Plack::Request; sub app { return sub { my $env = shift; my $router = MyApp::Web::Router::Sinatraish->router; my $route = $router->match($env) or return [ 404, [], ['not found'] ]; my $request = Plack::Request->new($env); my $response = $route->{code}->($request); return $response->finalize(); }; } 1;
ããããMyApp::Web::Router::Sinatraishãä½æãã¾ãã
package MyApp::Web::Router::Sinatraish; use strict; use warnings; use Router::Simple::Sinatraish; get '/' => sub { my $request = shift; my $response = $request->new_response(200); $response->content_type('text/plain'); $response->body("hello, I'm okamuuu. Thank you!!"); return $response; }; get '/bye' => sub { my $request = shift; my $response = $request->new_response(200); $response->content_type('text/plain'); $response->body("bye bye!!"); return $response; }; 1;
ãã¹ãããã¨æåãã¾ãã
:!prove -vl t/web.t t/web.t .. ok 1 - use MyApp::Web::Handler; ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 1..7 ok All tests successful.
ã¾ã¨ã
ãããªãããªã§å°ããã¤WaFã£ã½ããªã£ã¦ããã¨æãã¾ãããã®ããã«ãã¹ããå°ããã¤å¤åãããªããéçºãããããã¨å®è£
ã«éä¸ãããã¨ãã§ããã®ã§ããã楽ã§ãã
ã¡ãªã¿ã«ç§ã¯viããproveã³ãã³ããå¼ãã§ãã¾ã*2ã
ãããªãããªã§ãã¹ããæ¸ãã®ãé£ãããã¨ãã声ãèãã¾ãããç§ã®å ´åã¯éã«ãããã£ã¦éçºããã»ããæéãããããªãã®ã§æ¥½ã ã¨æãã¾ãã
ã ããã¿ããªããã¹ããæ¸ãã¦ã¿ã¾ãããï¼