[Zope3-Users] Calling a view in a doc test

Florian Lindner mailinglists at xgm.de
Tue Jun 5 10:49:37 EDT 2007


Am Montag, 4. Juni 2007 schrieb Marius Gedminas:
> On Mon, Jun 04, 2007 at 03:14:16PM +0200, Florian Lindner wrote:
> > Hello,
> > in a doctest I have an object which has a view registered.
> > I want to call this view and test for the XML it returns.
> > How can I call the view so that it is being rendered, just like called by
> > a browser?
>
> Is that in a unit test, or a functional test?
>
> In a unit test you can do it like this:
>     >>> context = ...yourcontentobject...
>     >>> from zope.publisher.browser import TestRequest
>     >>> request = TestRequest()
>     >>> view = MyViewClass(context, request)
>     >>> print view()
>
>     <some xml or whatever output here>
>
> If you want to provide, e.g., form parameters, pass them to the request:
>     >>> request = TestRequest(form={'foo': u'Lalala\u1234'})
>
> If your view does anything interesting (e.g. use TALES expressions, or
> refer to other views like context/@@absolute_url), you will need to
> register a whole bunch of components in your doctest setUp methods.
> Don't forget to tear them down afterwards.  IIRC you will need
>
>     from zope.app.testing import setup
>
>     def setUp(test):
>         setup.placelessSetUp()
>         setup.setUpTraversal()
>
>     def tearDown(test):
>         setup.placelessTearDown()
>
> at the very least.  Accessing other views, resources, or, god forbid,
> forms, will require other component registrations.  At some point you
> have two choices: figure out this stuff once and then use copy & paste
> (actually, helper functions defined once in your project), or switch to
> testing your views with functional tests.

Hello,
I have thes setup and tearDown methods:

import unittest
import zope.testing.module
from zope.testing import doctest
from zope.component import testing, eventtesting
from zope.app.container.tests.placelesssetup import PlacelessSetup
from zope.app.testing import setup

container_setup = PlacelessSetup()

def blogSetUp(test):
    zope.testing.module.setUp(test, 'Blog.doctest')
    testing.setUp(test)
    eventtesting.setUp(test)
    container_setup.setUp()
    setup.placelessSetUp()
    setup.setUpTraversal()

def blogTearDown(test):
    setup.placelessTearDown()
    zope.testing.module.tearDown(test)
    testing.tearDown(test)


and this is my README.txt containing the test:

    >>> context = MyBlog
    >>> from zope.publisher.browser import TestRequest
    >>> from browser.views import RSSFeed
    >>> request = TestRequest()
    >>> view = RSSFeed(context, request)
    >>> print view()

Since my code includes a call to absoluteURL I have added your setup and 
tearDown methods. But there is still an error:

      File "/home/florian/Zope3/src/zope/traversing/browser/absoluteurl.py", 
line 34, in absoluteURL
        return zope.component.getMultiAdapter((ob, request), IAbsoluteURL)()
      File "/home/florian/Zope3/src/zope/traversing/browser/absoluteurl.py", 
line 55, in __str__
        raise TypeError(_insufficientContext)
    TypeError: There isn't enough context to get URL information. This is 
probably due to a bug in setting up location information.


Do you know what's missing here?

Thanks,

Florian

BTW: What would be the name of the MyViewClass if the page would be registered 
without a class set?


More information about the Zope3-users mailing list