September 19, 2010
Amonでctx_request
Ark::Test や Catalyst::Test でおなじみの ctx_request をつかってテストを書く必要があったので書いてみました.
Data::Util or Moose を使う程ではないと思ったので, ベタっといった感じ.俺はそんな感じ.
正しい実装ではない可能性があることを断っておきます.
package Amon::Test::WWW::Mechanize::PSGI; use parent 'Test::WWW::Mechanize::PSGI'; use strict; use warnings; our $VERSION = '0.01'; use Clone::PP qw/clone/; sub ctx_request { my $self = shift; amon_install_context_getter(); my $res = $self->request(@_); return $res, amon_context(); } my $_amon_installed; sub amon_install_context_getter { return if $_amon_installed; no strict 'refs'; no warnings 'redefine'; do { my $orig = *{'Amon::Web::Response::finalize'}{CODE}; *{'Amon::Web::Response::finalize'} = sub { my @r; if (!defined wantarray) { $orig->(@_); } elsif (wantarray) { @r = $orig->(@_); } else { $r[0] = $orig->(@_); } amon_context(Amon->context); return wantarray ? @r : $r[0]; }; }; do { my $orig = *{'Amon::Web::run'}{CODE}; *{'Amon::Web::run'} = sub { my @r; if (!defined wantarray) { $orig->(@_); } elsif (wantarray) { @r = $orig->(@_); } else { $r[0] = $orig->(@_); } $Amon::_context = amon_context(); return wantarray ? @r : $r[0]; }; }; $_amon_installed = 1; } do { my $context; sub amon_context { if ($_[0]) { $context = $_[0]; $context = clone($context); } $context; } }; 1; __END__
次のテストは通る。
use strict; use warnings; use Test::More; use TestApp::Web; use Amon::Test::WWW::Mechanize::PSGI; use HTTP::Request::Common; my $app = TestApp::Web->to_app; my $mech = Amon::Test::WWW::Mechanize::PSGI->new(app => $app); my ($ret, $c) = $mech->ctx_request(GET '/'); isa_ok $ret, 'HTTP::Response'; use Amon::Web::Declare; isa_ok( c(), 'Amon::Web' ); isa_ok $c, 'Amon::Web'; isa_ok( Amon->context, 'Amon::Web' ); is_deeply( $c, Amon->context ); isa_ok $c->request, 'Amon::Web::Request'; isa_ok( Amon->context->request, 'Amon::Web::Request' ); is_deeply( Amon->context->pnotes, +{} ); is_deeply $c->pnotes, +{}; ($ret, $c) = $mech->ctx_request(POST '/', { foo => 'bar' }); isa_ok $ret, 'HTTP::Response'; isa_ok $c, 'Amon::Web'; is $c->request->param_decoded('foo'), 'bar', 'param_decoded'; is param_decoded('foo'), 'bar', 'param_decoded'; done_testing;
トラックバック - http://d.hatena.ne.jp/IMAKADO/20100919/1284835450
- 技術日記@kiwanami - (kansai-emacs #x02)に参加してきました
- hchbaw記 - uimでACT09キーマップ
- Emacs/Lisp/Drill - 空気のようなEmacs Lisp 2010 冬
- 再発明日記 - anything-c-key-chord-describe をいじってみた
- おきゃんなダイアリー - (kansai-emacs #x3)の感想かいたよ
- 技術日記@kiwanami - 関西Emacsに行ってきた
- Life is very short - 今すぐフォローすべき Emacs界のスーパーエ...
- むしゃくしゃしてやった - key-comboを使って読みやすいコードを書...
リンク元
- 209 http://d.hatena.ne.jp/kiwanami/20110224/1298526678
- 162 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/IMAKADO/20080401/1206715770&ei=dE8xT-y8POLqmAWAmpG8BQ&usg=AFQjCNGIS09wZvmenjGT6KvzDuSWvgNKBA&sig2=Y7cOnRfpjFRsaNIEcFIx3A
- 142 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=anything+yasnippet&qscrl=1
- 114 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/IMAKADO/20080724/1216882563&rct=j&q=anything-c-moccur.el&ei=n-mwTZP0Ho7EvgPO5KGKBw&usg=AFQjCNF1DUfN-DC-kVUfY2YvO6QFIvZzfg
- 94 http://www.google.co.jp/url?sa=t&rct=j&q=anything-c-moccur&source=web&cd=1&ved=0CCUQFjAA&url=http://d.hatena.ne.jp/IMAKADO/20080724/1216882563&ei=BWOrTtHgJsOgiQer4vnWDw&usg=AFQjCNF1DUfN-DC-kVUfY2YvO6QFIvZzfg&sig2=UIVzK5YEsqEIPswKD-UM8g
- 91 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CC4QFjAB&url=http://d.hatena.ne.jp/IMAKADO/20091127/1259291382&ei=jmg-T7-PO6SPiAeKirnCCA&usg=AFQjCNGUUxzDX9Kt3V8_bCQqwRwBTpxaQg
- 88 http://www.zeuux.org/group/hacking/bbs/content/2592/
- 82 http://www.google.co.jp/url?sa=t&rct=j&q=color-moccur.el&source=web&cd=1&ved=0CBsQFjAA&url=http://d.hatena.ne.jp/IMAKADO/20080724/1216882563&ei=vSiFTujnIojNmAWY5tT3Dw&usg=AFQjCNF1DUfN-DC-kVUfY2YvO6QFIvZzfg
- 76 http://www.google.co.jp/search?q=color-moccur.el&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 74 http://d.hatena.ne.jp/mizchi/20100806/1281093295