-- till <[email protected]> wrote
(on Wednesday, 18 March 2009, 12:35 PM +0100):
> On Tue, Mar 17, 2009 at 7:25 PM, Matthew Weier O'Phinney
> <[email protected]> wrote:
> > -- till <[email protected]> wrote
> > (on Tuesday, 17 March 2009, 05:21 PM +0100):
<snip>
> The other thing I noticed was that it did in my ErrorController too (I
> tested it -- e.g. url does not exist, assert the status code is 404),
> but I am using setRawHeader() there.
>
> I'll give you a hopefully more detailed example:
>
> /**
> * Renders the response
> *
> * @param Zend_Controller_Response_Abstract $response - The response
> object
> * @return void
> */
> public function render(Zend_Controller_Response_Abstract $response)
> {
> $response->setHeader('Content-Type', 'text/html; charset=utf-8',
> true);
> $response->setHeader('P3P', 'policyref="/w3c/p3p.xml",CP="NOI
> DSP COR NID CURi DEVa OUR NOR"', true);
>
> $response->sendHeaders();
> $response->outputBody();
These are the problem right here. Zend_Test makes the assumption that
the front controller's dispatch() method is the only place that sends
headers and content back to the client; it can then take advantage of
the returnResponse front controller setting to prevent that from
happening, which then lets you make assertions against what the response
object contains.
So, the moral of the story: never send headers and output manually if
you want to test your controllers.
<snip>
> > > 2) My www/index.php kinda looks like this:
> > > $app = new Bootstrap('environenment');
> > > $app->start();
> > >
> > > Now, I thought I could duplicate this in my tests like this:
> > >
> > > ...
> > > public function setUp()
> > > {
> > > $bootstrap = new Bootstrap('testing');
> > > $this->bootstrap = array($bootstrap, 'start');
> > > }
> > >
> > > ... but to no avail. Whenever I do that, it returns the "entire" html
> > > of my frontpage, before anything happens. I'm not ruling out that it's
> > > my fault of course, but I also don't know how to debug this further.
> >
> > After you set that, call:
> >
> > parent::setUp();
> >
> > Otherwise, it won't bootstrap properly. :-) (This *is* documented and
> > shown in the examples.)
>
> Yeah, sorry -- I got that but I forgot to add it here. ;-( Btw,
> whenever I use $this->bootstrap($bootstrap, 'start') I get the entire
> homepage's HTML, when I use $this->bootstrap = '/path/www/index.php';
> I get further.
Odd -- I've used both, and both have worked without issue for me. I may
need to see the code to better understand what might be at play.
<snip>
> I've discovered the Zend_Session::$_unitTestEnabled flag, but why I am
> asking is, that, e.g. my tearDown() looks like this:
>
> public function tearDown()
> {
> Zend_Session::namespaceUnset('fooSession');
> Zend_Session::expireSessionCookie();
> Zend_Session::stop();
> Zend_Session::destroy(true);
>
> unset($this->bootstrap);
> }
>
> Yet, all consecutive tests fail because it says:
> Zend_Session_Exception: A session namespace object already exists for
> this namespace ('fooSession'), and no additional accessors (session
> namespace objects) for this namespace are permitted.
>
> I'm opening fooSession in my bootstrap, but from what I gather my
> tearDown() doesn't get rid off everything.
>
> That's another thing I've been wrestling with. ;-)
Get rid of your tearDown() method. The bootstrap() method calls reset(),
which resets the $_SESSION superglobal as well as Zend_Session. What
you've done in your tearDown() is redundant.
What happens if you remove it?
> I've researched (aka googled) this a bit and found a couple threads
> and issues related to Zend_Session and Zend_Test, but I never
> understood why people claim that sessions limited or hard to test on
> the CLI in general -- I think you can test this just fine, just check
> this for an example:
> <http://cvs.php.net/viewvc.cgi/pear/HTTP_Session2/tests/test-session.phpt?revision=1.1&view=markup>
The problem isn't $_SESSION. The problem is Zend_Session's design --
which, unfortunately, we can't refactor properly until 2.0. (It's an
awful, awful design, and makes testing really painful. Take a look at
the internals sometime.)
--
Matthew Weier O'Phinney
Software Architect | [email protected]
Zend Framework | http://framework.zend.com/