使用Codeception检查外部重定向

时间:2013-10-05 21:31:54

标签: php testing codeception

我想检查一下这样的事情:

<?php

$I->amOnPage('/go/google');
$I->seeCurrentUrlEquals('http://google.com');

但我得到错误:

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://google.com'
+''

Scenario Steps:
2. I see current url equals "http://google.com"
1. I am on page "/go/google"

想法只是检查用户是否被重定向到外部资源。

6 个答案:

答案 0 :(得分:4)

不幸的是,Codeception的seeCurrentUrlEquals()seeCurrentUrlMatches()方法被错误命名,因为它们不允许对整个URL进行断言,而只是针对URI部分。

我通过在Helper类中声明以下方法解决了这个问题:

public function seeFullCurrentURLEquals($value)
{
    return ($this->getModule('PhpBrowser')->client->getHistory()->current()->getUri() == $value);
}

然后,在场景中,您可以简单地执行以下操作:

$I->seeFullCurrentUrlEquals('google.com');

答案 1 :(得分:2)

我会通过换掉第2行来提高@ rickroyce的评论

$I->wait(2);

类似

$I->waitForElement('#gbqfq', 30);

等待谷歌搜索输入字段,并且更加强大,然后假设2秒足以填充页面。

那么完整的例子就是

<?php

$I->amOnPage('/go/google');
$I->waitForElement('#gbqfq', 30);
$I->seeCurrentUrlEquals('http://google.com');

(通常它会将添加内容作为评论,但因为我没有足够的声誉,所以答案是:))

答案 2 :(得分:1)

正如@gopherIT所提到的,Codeception在使用这些函数时不会检查URL的域名部分。

如果你使用 phpBrowser ,这里有几个选项。

  1. 我写了两个函数verifyRedirect()verifyNoRedirect(),可用于此目的。您只需在_support/Helper/Acceptance.php内弹出代码。

    然后可以这样测试......

    $I->verifyRedirect('http://www2.ames.net.au/', 'http://www.ames.net.au/', 301);
    

    查看代码:https://gist.github.com/SimonEast/b550e04300ac56cb5ac8eea704fccdfa

    1. GaryJones还为测试重定向整理了另一个(稍微复杂一点)的变体并将其发布在Github上:

      https://gist.github.com/GaryJones/284eea905cff882cc7cb

      它允许你运行这样的测试......

      $I = new RedirectsTester($scenario);
      $I->wantTo('check 301 redirects are working');
      
      // First, test /login/ page gets rewritten to https://
      $I->seePermanentRedirectToHttpsFor('login/');
      $I->seePermanentRedirectToHttpsFor('login/?redirect_to=foo');
      
      // For all other redirects, a Location header is sent, so we stop the redirect
      // and just check that header instead.
      $I->followRedirects(false);
      
      // External
      $I->sendHead('facebook');
      $I->seePermanentRedirectTo('https://www.facebook.com/DanielsTrading');
      
      // Internal link
      $I->sendHead('don-debartolo/access');
      $I->seePermanentRedirectTo('ddebartolo/#account');
      

      如有必要,查看他的源代码可能有助于进一步定制。

答案 3 :(得分:0)

您想使用哪种浏览器?大多数浏览器需要一些时间来解释重定向。访问网站“/ go / google”后,测试立即运行url检查,这可能比浏览器可以更快地执行重定向。给它一点时间。

尝试:

<?php

$I->amOnPage('/go/google');
$I->wait(2);
$I->seeCurrentUrlEquals('http://google.com');

亲切的问候

答案 4 :(得分:0)

以下是一段可以提供帮助的代码:

$uri_to_redirect = '/use_stackoverflow';
$redirected_to_uri = '/love_stackoverflow';

$I->wantToTest( 'if rediecting works well from : '.$uri_to_redirect.' to : '.$redirected_to_uri );
$I->amOnUrl( $mydomain.$uri_to_redirect );
$I->seeCurrentUrlEquals( $redirected_to_uri );

你需要保持头脑,“seeCurrentUrlEquals”验证URI,而不是URL。

问候

答案 5 :(得分:-1)

检查响应代码会不会更好?

$I->amOnPage('/go/google');
$I->seeResponseCodeIs(302);
$I->seeHttpHeader('Location', 'http://google.com');