REST サービスを介して API からデータを取得するサブがあります。コードはかなり単純ですが、API にパラメーターをポストする必要があり、SSL を使用する必要があるため、LWP::UserAgentを経由する必要があり、 LWP::Simpleを使用できません。これはその簡略版です。
sub _request {
my ( $action, $params ) = @_;
# User Agent fuer Requests
my $ua = LWP::UserAgent->new;
$ua->ssl_opts( SSL_version => 'SSLv3' );
my $res = $ua->post(
$url{$params->{'_live'} ? 'live' : 'test'}, { action => $action, %$params }
);
if ( $res->is_success ) {
my $json = JSON->new;
return $json->decode( $res->decoded_content );
} else {
cluck $res->status_line;
return;
}
}
これは、モジュール (OOp ではない) で必要な唯一の場所です$ua
。
今、私はこのためのテストを書きたいと思っています.いくつかの調査の結果、 Test::LWP::UserAgentを使用するのが最善であると判断されました.これは本当に有望に思えます. 残念ながら、落とし穴があります。ドキュメントでは、次のように述べています。
LWP::UserAgent 自体にはモンキー パッチが適用されていないことに注意してください。このモジュール (またはサブクラス) を使用してリクエストを送信する必要があります。そうしないと、キャッチして処理することができません。
useragent の実装を交換する一般的なメカニズムの 1 つは、遅延ビルドされた Moose 属性を使用することです。構築時にオーバーライドが提供されない場合、デフォルトは LWP::UserAgent->new(%options) になります。
ああ。明らかに、ムースのことはできません。$ua
サブにa を渡すこともできません。もちろん、サブにオプションの 3 番目のパラメーターを追加することもできます$ua
が、それを行うという考えは好きではありません。テスト可能にするためだけに、このような単純なコードの動作を根本的に変更するのはよくないと思います。
私が基本的にやりたいことは、次のようにテストを実行することです。
use strict;
use warnings;
use Test::LWP::UserAgent;
use Test::More;
require Foo;
Test::LWP::UserAgent->map_response( 'www.example.com',
HTTP::Response->new( 200, 'OK',
[ 'Content-Type' => 'text/plain' ],
'[ "Hello World" ]' ) );
is_deeply(
Foo::_request('https://www.example.com', { foo => 'bar' }),
[ 'Hello World' ],
'Test foo'
);
Test::LWP::UserAgent 機能を LWP::UserAgent にモンキーパッチして、私のコードが Test:: を使用するようにする方法はありますか?