测试有状态的Mojolicious应用程序

时间:2015-11-26 12:15:39

标签: 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')->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);

我的问题是两行&#39; / publications / hide / 1&#39;和&#39; / publications / unhide / 1&#39;不要隐藏和取消隐藏条目。条目的状态保持不变。

如果我在浏览器中手动重复这些步骤,一切正常。出于显而易见的原因,我希望通过测试使其自动化。怎么做?

编辑:电话&#39; / publications / hide / 1&#39;和&#39; / publications / unhide / 1&#39;更改数据库的状态 - 只是一个简单的UPDATE查询。此更改适用于整个应用程序 - 适用于所有用户。但是需要以用户身份登录才能隐藏/取消隐藏。问题:如何在测试期间模拟已登录用户?

由&#39; / read / publications / meta&#39;生成的内容和&#39; / read / publications / meta / 1&#39;无需登录即可阅读。

Bitbucket Repo

File with test code: basic.t

1 个答案:

答案 0 :(得分:3)

正如您已经说过的,您需要登录才能执行hideunhide操作。

my $t = Test::Mojo->new('AdminApi');

您正在此处创建新的UserAgent。 Test :: Mojo类继承自Mojo :: UserAgent。它有cookie_jar,因此会话保持活跃状态​​。您需要执行此操作:

$t->get_ok('/publications/hide/1');

但是现在你还没有登录。你需要做的就是登录用户。查看code in your repository,您实际上断言您未登录

 $t->get_ok('/')->status_is(200)->content_like(qr/Please login or register/i);

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

$t->post_ok(
    '/do_login' => { Accept => '*/*' },
    form        => { user   => 'admin', pass => 'hunter2' }
);

现在您的$t UserAgent 应该已登录,您可以执行hide。请注意,get_ok仅检查是否没有传输错误。所以实际上现在检查一下你现在是否已登录是有意义的。

您可以通过检查应用程序中的会话,检查日志文件(您在那里编写"Login success")或通过检查页面中的某些字符串来表明用户已登录来执行此操作。在{{ 3}}有一个欢迎登录用户的文本,因此你可以使用它。

$t->post_ok(
    '/do_login' => { Accept => '*/*' },
    form        => { user   => 'admin', pass => 'hunter2' }
)->text_like(qr/Nice to see you here admin/i);

由于text_like使用文字节点,因此用户名周围的<em>与测试无关。

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

$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仍然登录。也许登录用户可以看到隐藏的内容以及未隐藏的内容。也许他们不是。

使第二个未登录的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.或者名称是什么。你应该使用灯具进行测试。例如,您可以使用sqlite创建一个新的DB实例并使用它。