我有一個通過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
。
現在我想寫一個測試,並在一些research決定後最好使用Test::LWP::UserAgent,這聽起來真的很有希望。不幸的是,有一個問題。在DOC,它說:
注意,LWP :: UserAgent的本身不是猴子打補丁 - 你必須使用 該模塊(或子類)發送請求,或者它不能 捕獲並處理。
換出useragent實現的一個常見機制是通過一個 延遲構建的Moose屬性;如果在 施工時間未提供覆蓋,則默認爲LWP :: UserAgent-> new(%選項)。
Arghs。顯然我不能做麋鹿的事情。我不能僅僅通過一個$ua
的子,也。我當然可以添加一個可選的第三個參數$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'
);
是否有猴補丁測試:: LWP :: UserAgent的功能集成到LWP :: UserAgent的,這樣的方式我的代碼只是使用Test :: one?
IMO,可測性是一個有效的代碼問題。編碼的目標是有一些「有效」的東西。所以,目標狀態的陳述會是這樣的:「它有效」。然而,經驗告訴我:「除非測試表明它沒有任何效果。」 – Axeman 2013-02-19 16:49:45