[Zope-dev] REQUEST vs. request
Patrick Gerken
do3ccqrv at googlemail.com
Mon Jun 22 06:47:19 EDT 2009
Hi, thank you for all that answers, this was really helpful!
On Mon, Jun 22, 2009 at 12:18, Hanno Schlichting <hanno at hannosch.eu> wrote:
> On Tue, Jun 16, 2009 at 10:35 PM, Patrick Gerken<do3ccqrv at googlemail.com>
> wrote:
> > A testcase in my code fails, and after a lot of digging, I am finding
> that
> > the reason are wrong results from the catalog. The catalog returns bad
> > results because he caches the results in the request.
> > My test consists of a number of steps, for multiple times I do a
> > getMultiAdapter, always with fresh TestRequests. Still it seems, that the
> > catalog always use some other, rotten REQUEST.
>
> Looking at this again, you are missing an important point about the
> test framework you use.
>
> In all of ZopeTestCase (CMFTestCase, PloneTestCase) you get a
> convenience request object set up for you, reachable as app.REQUEST.
> This mirrors the way you usually get access to the request object in
> Zope2 via Acquisition down to the application root. It's meant to
> emulate a very minimal request object.
>
> Now in normal operation, you would get one request object per HTTP
> request. This also works in the functional variants of the test case
> classes.
>
> In the non-functional test classes you only ever get one request
> object set up, as there's no object publishing or HTTP request
> handling being done. If you or any code you call changes any settings
> on that request object and you want to test things dependent on this
> you have two options: Either create a fresh request yourself (using
> Testing.makerequest) in your tests or use a functional test case
> instead.
I did excactly that. Since it was a caching issue in code out of my reach, I
had problems with.
Sadly, creating a new request and saving it on self.app.REQUEST was not
enough.
The code in question acquires the method that caches something on the
REQUEST from a getSite() call.
It seems like getSite() returns a copy of the site, and that has its own
copy of the request too.
>>> self.app.REQUEST == getSite().REQUEST
True
>>> self.app = makerequest(self.app)
>>> self.app.REQUEST == getSite().REQUEST
False
The copy getSite() returns is deleted in an EndRequest Event handler...
I did not use zc.testbrowser for testing, because I did test XMLRPC Methods,
and it seemed easier to just use getMultiAdapter and test the view directly.
I solved my issues but it is a bit inconvenient nowadays...
Best regards and thank you!
Patrick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope-dev/attachments/20090622/1941f459/attachment.html
More information about the Zope-Dev
mailing list