Hi there

I have a problem with controller test cases and I think this is a
general problem. It may be that I am totally wrong, however it would be
great if someone could help me sort this out.

When dispatching multiple times within a controller test case, the
assertion about the redirection might lead to a wrong result.

In my case I have to login before I can dispatch the tested controller,
the tested action  is only accessible by an authenticated and authorized
user.

In order to be able to send a form that validates, I dispatch the action
by a _GET_ request, get the _csrf_ token and dispatch the action again
with a _POST_ request - all after logging in first.

Login works and the _GET_ request of the tested action works as well, I
am able to read the csrf token from the response. I am positive that the
post request works as well (I can verify the creation of a new item in
the testing database).

The last issued request (post request) finally redirects to a specific
location. This works when doing this with the browser. If done in a
controller test case, the assertion about the location header fails with
the reason that the effective redirection is taking place to "/" instead
to the specific route.

The header with the correct location is present, that can be verified by
investiating the actual response. In fact the method
=toString()= of the headers gives a different result than accessing the
location header directly:

$headers = $this->getApplication ()->getResponse ()->getHeaders ();
...
var_dump ($headers->toString ());
// leads to:
string(41) "Location: /pres/pharmacy/edit/1
"
...
var_dump ($headers->get ('location'));
// leads to:
class Zend\Http\Header\Location#3642 (1) {
  protected $uri =>
  class Zend\Uri\Uri#3869 (8) {
    protected $scheme =>
    NULL
    protected $userInfo =>
    NULL
    protected $host =>
    NULL
    protected $port =>
    NULL
    protected $path =>
    string(1) "/"
    protected $query =>
    NULL
    protected $fragment =>
    NULL
    protected $validHostTypes =>
    int(31)
  }
}

Now the test fails:

Failed asserting response redirects to "/pres/pharmacy/edit/1", actual
redirection is "/"

I am not sure if multiple dispatching within controller tests is
something that is not supposed to work. If this was the case, I would
need to refactor about the entire application, complicating things
heavily - I would need to modify the entire authentication stack, modify
the creation of all forms and so on - everything in order to be able to
test the application. I hope there is another answer to this...

Big thanks in advance!
Greets
dave


-- 
List: [email protected]
Info: http://framework.zend.com/archives
Unsubscribe: [email protected]


Reply via email to