【发布时间】:2016-10-29 11:40:31
【问题描述】:
我目前扩展了我的测试套件以增加测试覆盖率。我想测试我的控制器及其呈现的 html 输出,但我发现使用 delete 方法时出现问题。让我用一个例子来解释一下。
我有一条路线:
$r->delete('/backups/:id')
->to('backup#delete_backup')
->name('backup_delete');
指向backup控制器中的以下函数:
sub delete_backup {
my $self = shift;
my $id = $self->param('id');
if ( something ) {
$self->flash( msg => "Backup id $id deleted!" );
}
else{
$self->flash( msg => "Cannot delete, backup id $id not found!" );
}
$self->redirect_to($self->url_for('backup_index'));
}
处理路由backup_index 的方法只显示$msg 并显示一些其他不相关的数据。
接下来,我想测试一下这个方法,所以我写了一个测试:
$t_logged_in->ua->max_redirects(3);
my $page = $t_logged_in->app->url_for( 'backup_delete', id => $backup_id );
$t_logged_in->delete_ok($page)
->status_isnt( 404, "Checking: 404 $page" )
->status_isnt( 500, "Checking: 500 $page" );
测试通过了。但是现在,我想检查重定向后显示的网页上的文本是否正确。所以我做了以下事情:
$t_logged_in->ua->max_redirects(3);
my $page = $t_logged_in->app->url_for( 'backup_delete', id => $backup_id );
$t_logged_in->delete_ok($page)
->status_isnt( 404, "Checking: 404 $page" )
->status_isnt( 500, "Checking: 500 $page" )
->content_unlike(qr/Cannot delete,/i)
->content_like(qr/deleted/i);
测试失败。失败是因为内容是空的,所以匹配照原样完成:
'' =~ /deleted/i;
'' !~ /Cannot delete,/i;
这在这两种情况下当然都是错误的。当然,在浏览器中,重定向工作得很好,我看到了测试中设计的一切。我可以将方法更改为POST 或GET,但我想按照 API 的设计方式正确地进行路由。
问题:如何设计测试以使重定向后的内容可以匹配?
对于那些想深入挖掘的人,我提供了 Github 的链接。
【问题讨论】:
标签: perl redirect testing mojolicious test-more