我想测试隐藏和取消隐藏条目。我在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;无需登录即可阅读。
答案 0 :(得分:3)
正如您已经说过的,您需要登录才能执行hide
和unhide
操作。
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实例并使用它。