Zend framework PHPUnit和Zend Framework assertRedirectTo()问题

Zend framework PHPUnit和Zend Framework assertRedirectTo()问题,zend-framework,phpunit,Zend Framework,Phpunit,在我创建的一个测试中,我遇到了assertRedirectTo()的问题,下面是我使用的代码: public function testLoggedInIndexAction() { $this->dispatch('/'); $this->assertController('index'); $this->resetResponse(); $this->request->setPost(array( 'type' => 'login',

在我创建的一个测试中,我遇到了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

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


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

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

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

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

请参阅标题中误导性的具体内容:问题涉及所有重定向,尤其是那些必须设置头并退出而不是调度原始控制器的重定向


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

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

$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']);

我已经回答了这个问题

我也有同样的问题。。。一种可能的断言方式可能是

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

在我发现错误之后


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

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

。。。解决问题!;)

作为将来的参考,我今天遇到了这个问题,它是由
Url
类未能构建有效的Url(我传递了错误的参数)引起的,但没有向PHPUnit报告错误(可能是因为PHPUnit掩盖了错误)


更正url参数将修复url及其断言。

馈送是indexControlleR中的一项操作吗?如果是,请尝试:$this->assertRedirectTo('/index/feed');不,这是一个完全不同的控制器。根据我的理解,测试表单的正确方法是使用mock和stub,请检查这里(他在isValid true/false上测试一个from重定向),如果您在controller init()中执行所有重定向,我还想补充一点-例如,假设您用自己的基类包装Zend的Controller Action类-并通过以下方式进行:(在init()中)如果(cond){return$this->redirector->gotoSimple('logout','login','default');}如果您的应用程序工作正常,测试应该通过,如果不正常,测试应该失败。
'.../public//picking/orders/browse/invalid/empty'
'.../public/picking/orders/browse/invalid/empty'