gpt4 book ai didi

perl - 如果无法直接替换应用程序代码中的 $ua,如何使用 Test::LWP::UserAgent?

转载 作者:行者123 更新时间:2023-12-01 10:56:23 31 4
gpt4 key购买 nike

我有一个子程序可以通过 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 ,这听起来很有希望。不幸的是,有一个陷阱。在文档中,它说:

Note that LWP::UserAgent itself is not monkey-patched - you must use this module (or a subclass) to send your request, or it cannot be caught and processed.

One common mechanism to swap out the useragent implementation is via a lazily-built Moose attribute; if no override is provided at construction time, default to LWP::UserAgent->new(%options).

唉。显然我不能做驼鹿的事情。我也不能只将 $ua 传递给 sub。我当然可以将可选的第三个参数 $ua 添加到 sub,但我不喜欢这样做的想法。我觉得仅仅为了使其可测试而如此彻底地改变这种简单代码的行为是不好的。

我基本上想做的是像这样运行我的测试:

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::一个?

最佳答案

更改您的代码,以便在 _request() 中调用 _ua() 来收集您的用户代理并在您的测试脚本中覆盖此方法。像这样:

在你的模块中:

sub _request {
...
my $ua = _ua();
...
}

sub _ua {
return LWP::UserAgent->new();
}

在你的测试脚本中:

...
Test::More::use_ok('Foo');

no warnings 'redefine';
*Foo::_ua = sub {
# return your fake user agent here
};
use warnings 'redefine';
... etc etc

关于perl - 如果无法直接替换应用程序代码中的 $ua,如何使用 Test::LWP::UserAgent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14960460/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com