Perl 测试有状态的mojolious应用程序
我想测试条目的隐藏和取消隐藏。我在Mojolicious t/basic.t中执行以下测试: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
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);