Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 测试有状态的mojolious应用程序_Perl_Testing_Automated Tests_Mojolicious - Fatal编程技术网

Perl 测试有状态的mojolious应用程序

Perl 测试有状态的mojolious应用程序,perl,testing,automated-tests,mojolicious,Perl,Testing,Automated Tests,Mojolicious,我想测试条目的隐藏和取消隐藏。我在Mojolicious t/basic.t中执行以下测试: my $t = Test::Mojo->new('AdminApi'); $t->get_ok('/publications/hide/1'); $t->get_ok('/read/publications/meta')->content_unlike(qr/Paper with id 1:/i); $t->get_ok('/read/publications/meta/1

我想测试条目的隐藏和取消隐藏。我在Mojolicious t/basic.t中执行以下测试:

my $t = Test::Mojo->new('AdminApi');
$t->get_ok('/publications/hide/1');
$t->get_ok('/read/publications/meta')->content_unlike(qr/Paper with id 1:/i);
$t->get_ok('/read/publications/meta/1')->content_like(qr/Cannot find entry id: 1/i);

$t->get_ok('/publications/unhide/1');
$t->get_ok('/read/publications/meta')->content_like(qr/Paper with id 1: <a href/i);
$t->get_ok('/read/publications/meta/1')->content_unlike(qr/Cannot find entry id: 1/i);
my$t=Test::Mojo->new('AdminApi');
$t->get_ok('/publications/hide/1');
$t->get_ok('/read/publications/meta')->内容(qr/id为1的纸张:/i);
$t->get_ok('/read/publications/meta/1')->内容类似(qr/找不到条目id:1/i);
$t->get_ok('/publications/unhide/1');
$t->get_ok('/read/publications/meta')->类似内容(id为1的qr/纸张:


如前所述,您需要登录才能执行
隐藏和
取消隐藏操作

您正在此处创建一个新的UserAgent。Test::Mojo类继承自Mojo::UserAgent。它有一个
cookie\u jar
,从而使会话保持活动状态。您需要它来执行此操作:

但是现在您没有登录。您需要做的是登录用户。查看,您实际上声明您没有登录

在执行
隐藏之前,您需要登录用户。在代码中挖掘一点之后,我找到了操作并执行了该操作,因此我知道请求需要的样子

$t->post_ok(
    '/do_login' => { Accept => '*/*' },
    form        => { user   => 'admin', pass => 'hunter2' }
);
现在,您的
$t
用户代理应该已登录,您可以执行
隐藏
。请注意,仅检查是否存在传输错误。因此,事实上,现在检查您是否已登录是有意义的

您可以通过在应用程序中内省会话、检查日志文件(您正在那里编写
“登录成功”
)或检查页面中表示用户已登录的字符串来实现这一点。其中有一个欢迎登录用户的文本,因此您可以使用它

$t->post_ok(
    '/do_login' => { Accept => '*/*' },
    form        => { user   => 'admin', pass => 'hunter2' }
)->text_like(qr/Nice to see you here admin/i);
因为
text\u like
使用文本节点,所以用户名周围的
在测试中不相关

好的,现在我们知道你已经登录了。是时候打开和关闭它了

$t->get_ok('/publications/hide/1');
因为据我所知,没有明显的错误抛出,所以我不知道如何测试成功。状态代码是一种方法,但内容中可能也有一些东西可以测试

要验证应用程序的状态,现在可以调用发布

是的。但是请记住,我们的
$t
仍在登录中。可能登录的用户可以看到隐藏的内容以及未隐藏的内容。可能不是

创建第二个未登录的UserAgent,并与该UserAgent进行检查可能更安全

# check with an unauthorized user
my $t_not_logged_in = Test::Mojo->new('AdminApi');
$t_not_logged_in
  ->get_ok('/read/publications/meta')
  ->content_unlike(qr/Paper with id 1:/i);
$t_not_logged_in
  ->get_ok('/read/publications/meta/1')
  ->content_like(qr/Cannot find entry id: 1/i);
现在,基本上你通过取消隐藏内容并再次测试来重复同样的事情。冲洗并重复



请记住,除非您使用的是显式测试数据库(您似乎没有这样做),您甚至无法确定是否有条目1。或者条目的名称。您应该使用fixture进行测试。例如,您可以使用sqlite创建一个新的DB实例并使用它。

/publications/hide/1
/publications/unhide/1
在数据库中更改了ressource的状态服务器上的应用程序?该状态与用户相关,还是与整个应用程序相关?是否有会话cookie,并且它是否为使用
get\u ok
发出的每个请求保留相同的会话?我将缺少的信息和链接添加到代码库中。谢谢!这非常有帮助!现在,我可以完成编写会话cookie了EST正确。我有一个单独的服务器用于测试,在那里我可以快速将数据库重置为预定义状态。我正在使用bash脚本进行测试,但我可能会为此添加一些perl代码以实现更高的自动化。对于未来:片段“因为
text\u like
使用文本节点,用户名周围的字符在测试中不相关。”在当前版本中似乎不正确。您需要像使用
内容一样使用
。我不记得写过这个答案,但我相信您是正确的@Piotr:)
$t->post_ok(
    '/do_login' => { Accept => '*/*' },
    form        => { user   => 'admin', pass => 'hunter2' }
)->text_like(qr/Nice to see you here admin/i);
$t->get_ok('/publications/hide/1');
$t->get_ok('/read/publications/meta')->content_unlike(qr/Paper with id 1:/i);
$t->get_ok('/read/publications/meta/1')->content_like(qr/Cannot find entry id: 1/i);
# check with an unauthorized user
my $t_not_logged_in = Test::Mojo->new('AdminApi');
$t_not_logged_in
  ->get_ok('/read/publications/meta')
  ->content_unlike(qr/Paper with id 1:/i);
$t_not_logged_in
  ->get_ok('/read/publications/meta/1')
  ->content_like(qr/Cannot find entry id: 1/i);