代码之家  ›  专栏  ›  技术社区  ›  Prisoner

PHPUnit和Zend Framework assertRedirectTo()问题

  •  3
  • Prisoner  · 技术社区  · 14 年前

    我在创建的测试中遇到了assertRedirectTo()问题,下面是我使用的代码:

    public function testLoggedInIndexAction() {
      $this->dispatch('/');
      $this->assertController('index');
      $this->resetResponse();
      $this->request->setPost(array(
       'type' => 'login',
       'username' => 'root',
       'password' => 'asdasd',
      ));
      $this->request->setMethod('POST');
      $this->dispatch('/');
      $this->assertRedirectTo('/feed/');
    }
    

    您通过/(index.php/)登录并在那里提交文章详细信息,然后它将您重定向到/feed/(index.php/feed/)。我提供的细节是正确的,但我有问题,PHPUnit说他们是错误的:

    There was 1 failure:
    
    1) IndexControllerTest::testLoggedInIndexAction
    Failed asserting response redirects to "/feed/"
    
    /home/public_html/mashhr/library/Zend/Test/PHPUnit/Constraint/Redirect.php:190
    /home/public_html/mashhr/library/Zend/Test/PHPUnit/ControllerTestCase.php:701
    /home/public_html/mashhr/tests/application/controllers/UserControllerTest.php:36
    
    5 回复  |  直到 14 年前
        1
  •  3
  •   RiverC    13 年前

    @poelinca:不,这只是Zend_Test在注册重定向时不可靠的情况(即使调用正确!)

    在他的例子中,真正的应用程序无疑正在正确地重定向用户,但是Zend_测试环境在注册正确的重定向时遇到了问题。我能想到的最佳响应是省略任何在应用程序中实际工作的失败assertRedirect。

    这不是一个最佳的情况,但是除非您准备好深入Zend代码以了解问题所在,否则这可能是您提高效率的最佳选择。这是导致单元测试得到一个坏名字的原因的一个例子:必须修改代码以通过实际已经工作的测试。

    http://framework.zend.com/issues/browse/ZF-7496 这个问题在标题中是误导性的:问题涉及所有重定向,尤其是那些必须设置标题和退出而不是调度原始控制器的那些重定向。

    不管出于什么原因,这种行为导致重定向不是总是失败,而是非常不可靠!如果有人知道这个问题的更好的解决方法(这是一般的,可能与操作系统的代码无关),请告诉我们。

        2
  •  3
  •   Kris Lamote    13 年前

    在遇到同样的问题时偶然发现了这个问题。我最后做了以下事情:

    $this->assertRedirect();
    $responseHeaders = $this->response->getHeaders();
    $this->assertTrue(count($responseHeaders) != 0);
    $this->assertArrayHasKey('value', $responseHeaders[0]);
    // in my case I'm redirecting to another module
    $this->assertEquals('/module/controller/action', $responseHeaders[0]['value']);
    
        3
  •  1
  •   Community Jaime Torres    7 年前

    我已经回答了这个问题 http://zend-framework-community.634137.n4.nabble.com/Zend-Test-failing-on-AssertRedirectTo-td3325845.html#a4451217

    我也有同样的问题。。。一种可能的方法来断言它可能在

    但问题是。。我的例子是(如果手动完成,wich实际上可以工作):

    // controller modules/picking/orders/product
    $orderId = $this->_getParam('oId');    
    if (empty($orderId)) {
        return $this->_redirect('picking/orders/browse/invalid/empty');
    }
    
    // test
    $this->dispatch('picking/orders/product');
    $this->assertRedirect(); // ok
    $this->assertRedirectTo('picking/orders/browse'); // error
    $this->assertRedirectTo('picking/orders/browse/invalid/empty'); // error
    

    在我发现错误之后!


    实际上,按照上面的示例,我发现示例中的字符串comparizon有一个错误:

    '.../public//picking/orders/browse/invalid/empty'
    '.../public/picking/orders/browse/invalid/empty'
    

    ... 修复预先设置的斜线解决问题!;)

        4
  •  0
  •   Poelinca Dorin    14 年前

    所以如果我理解正确,你写了一个失败的测试(我说这是完美的)。

    为了使测试通过,您需要调试您的应用程序并查看问题所在,在这种情况下,您需要查看实际的重定向(或在表单发送的post字段上留下),可能还要检查路由。我想这里没有人能回答你的问题,除非你在你的索引控制器/窗体/视图和提要控制器中发布代码。

        5
  •  0
  •   robertboloc    8 年前

    为了以后的参考,我今天有这个问题,它是由 Url 类未能生成有效的url(我传递了错误的参数),但未向PHPUnit报告错误(可能是因为PHPUnit掩盖了错误)。

    更正url参数将修复url并与之一起修复断言。