Как сделать поддельные объекты ответа HTTP для тестирования в perl - PullRequest
0 голосов
/ 06 июля 2011

Я написал Perl-скрипт, который передает данные в веб-сервис.

У меня есть несколько системных тестов для сценария perl, которые проверяют, могу ли я взаимодействовать с веб-сервисом, и они прекрасно работают, но я не хочу запускать системные тесты, когда я делаю небольшие изменения - я хочу запускать модульные тесты :

До сих пор я написал подкласс моего импортера, который просто перехватывает веб-запросы, прежде чем он фактически вызывает соответствующий URL-адрес, и проверяет, что все входные данные имеют правильный тип и форму, и это прекрасно работает во всех случаях, кроме случаев, когда сценарию perl необходимо прочитать ответ для получения инструкций, а затем перейти к следующим шагам.

Моя проблема в том, что я не могу подделать объект ответа.

Я пытался использовать HTTP :: Response-> new, но он продолжает жаловаться на неверные аргументы заголовка

Как мне лучше подделать объект ответа?

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Нет необходимости насмехаться над объектом 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>
3 голосов
/ 06 июля 2011

Возможно, вы ищете фиктивные объекты - в данном случае фиктивный объект LWP?

См. Test :: Mock :: LWP на CPAN.

Его документация показывает использование следующим образом:

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 , существует довольно много модулей для имитации / фальсификации объектов для тестирования.

...