如何在Perl中制作用于测试的Fake HTTP响应对象

时间:2011-07-06 17:20:03

标签: perl unit-testing httpwebrequest http-headers

我编写了一个将数据提供给Web服务的perl脚本。

我对perl脚本进行了一些系统测试,检查我是否可以与web服务进行交互,这些工作正常,但我不希望在进行小的更改时运行系统测试 - 我想运行单元测试:

到目前为止,我编写了一个导入器的子类,它只是在实际调用有问题的URL之前拦截Web请求,并测试所有输入的类型和形式是否正确,这在所有情况下都能正常工作,除非perl脚本需要读取指令的响应,然后继续执行后续步骤。

我的问题是我不能伪造一个响应对象。

我尝试过使用HTTP :: Response-> new,但它一直在抱怨错误的标头参数

如何最好地确认响应对象?

2 个答案:

答案 0 :(得分:4)

无需模拟HTTP::Response对象。它们易于构建 - 至少像模拟一样容易,并且不太可能将错误引入测试中。您需要阅读文档,而不仅仅是猜测使用情况。

当然,您可以在代码中构建它们,但我过去所做的不止一次只是保存curl的输出或针对应用程序的字符串化请求并将其解析回来进入一个物体。

尝试使用这些 -

use warnings;
use strict;
use HTTP::Response;

my $response = HTTP::Response->new(204);
print $response->as_string;

my $other = HTTP::Response->parse(join "", <DATA>);
print $other->decoded_content, $/;

__DATA__
HTTP/1.1 200 OK
Cache-Control: public, max-age=53
Content-Type: text/html; charset=utf-8
Expires: Wed, 06 Jul 2011 19:13:54 GMT
Last-Modified: Wed, 06 Jul 2011 19:12:54 GMT
Vary: *
Date: Wed, 06 Jul 2011 19:12:59 GMT
Content-Length: 198121

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Stack Overflow</title>
  </head>
<body class="home-page">
  <blockquote>O HAI!</blockquote>
</body>
</html>

答案 1 :(得分:3)

您可能正在寻找模拟对象 - 在这种情况下是一个模拟LWP对象?

请参阅有关CPAN的Test::Mock::LWP

其文档显示如下用法:

use Test::Mock::LWP;

# Setup fake response content and code
$Mock_response->mock( content => sub { 'foo' } );
$Mock_resp->mock( code => sub { 201 } );

# Validate args passed to request constructor
is_deeply $Mock_request->new_args, \@expected_args;

# Validate request headers
is_deeply [ $Mock_req->next_call ],
          [ 'header', [ 'Accept', 'text/plain' ] ];

# Special User Agent Behaviour
$Mock_ua->mock( request => sub { die 'foo' } );

如果您在CPAN中搜索Test::Mock,则会有很多模块用于模拟/伪造对象进行测试。