在mojolicious中测试JSON PUT请求

时间:2012-12-11 21:51:13

标签: perl testing mojolicious

我正在为使用Mojolicious框架开发的应用创建测试用例。我正在测试路由,以便为所做的REST调用做出适当的响应。我使用JSON作为服务器和客户端之间的通信方式。要测试GETPOSTDELETE请求,请使用以下函数

GET : get_ok()
POST: post_json_ok()
DELETE: delete_ok()

但对于PUT,我无法使用put_ok()。我使用put_ok()的例子是
my $t = Test::Mojo->new;
$t->put_ok('this/is/url/to/resource'=>{ "element" => "modified value"})->status_is(204)

我每次都收到错误的请求状态(400),因此测试失败。我使用Test::Mojo来测试我的应用程序。

附加信息:

$t->put_ok('http://localhost:3000/application/instances/system/test'=>{"model" => "testing put"})->status_is(204);

这是对PUT请求的确切测试。
model是资源test的属性,正在尝试更改至testing put,预期状态回复为204

到控制器的映射是通过 $r->route('/application/instances/system/:id, id => qr/[A-Za-z0-9 ]+/ -> via('put') ->to(controller => 'system', action => 'update_sys');
此路由调用update_sys控制器中的system方法,即资源的位置。

2 个答案:

答案 0 :(得分:4)

实际上,在与SRI就IRC进行讨论后,他向我指出了一个与documentation中您的需求完全相同的示例。

# Test custom transaction
my $tx = $t->ua->build_json_tx('/user/99' => {name => 'sri'});
$tx->req->method('PUT');
$t->tx($t->ua->start($tx))
  ->status_is(200)
  ->json_is('/message' => 'User has been replaced.');

所以这应该适合你!

<强>后记:

您可能有兴趣知道此讨论带来了一些进展:Mojolicious的下一个版本(版本3.66)现在将具有更清晰的语法,即新的request_ok方法。然后可以将上面的示例重写为

my $tx = $t->ua->build_json_tx('/user/99' => {name => 'sri'});
$tx->req->method('PUT');
$t->request_ok($tx)
  ->status_is(200)
  ->json_is('/message' => 'User has been replaced.');

答案 1 :(得分:1)

您可以分享'this / is / url / to / resource'的路线定义吗?服务器返回400,所以你的应用程序中的Mojo :: Controller似乎无法理解你发送的内容......