Как получить доступ к представлениям, определенным с помощью определенного [plone.] Browserlayer в тестовых примерах - PullRequest
5 голосов
/ 12 апреля 2011

Я новичок в тестировании и впервые пытаюсь создать тест для своего продукта Plone.Я на Plone 3.3.

Базовый набор тестов работает, я могу выполнить его без ошибок.Я следовал этой документации: http://plone.org/documentation/kb/testing ... за исключением того, что я пишу свои тесты в классах Python вместо doctests.

Моя проблема в том, что я не могу получить доступ к представлениям, определенным в моем приложении(Я получаю ComponentLookupError).

Кажется, проблема в «браузерном слое», определенном моими приложениями.Когда я удаляю атрибут layer = "..." из моего файла configure.zcml, тест может без проблем получить доступ к представлениям.Однако, если я добавлю его обратно, это не сработает.Я предполагаю, что это потому, что интерфейс de browserlayer не применяется к запросу.

Единственная ссылка на эту проблему, которую я обнаружил, находится в тестах для googlesitemap: http://dev.plone.org/collective/browser/googlesitemap/googlesitemap.common/trunk/googlesitemap/common/tests?rev=

Автор, кажется, создал для теста собственный файл ZCML, в котором слой = "... "атрибут был удален.(это будет работать, но, кажется, очень плохо поддерживать отдельный файл zcml для тестов)

В моем тесте я включил следующее (взято из тестов googlesitemap), которое проходит:

from jambette.site.interfaces import IJambetteLayer # this is my browserlayer
from plone.browserlayer.utils import registered_layers
self.assertTrue(IJambetteLayer in registered_layers())

Так что я думаю, что мой скин и браузерный слой зарегистрированы правильно.

Что мне нужно сделать, чтобы браузерный слой был применен к запросу?

1 Ответ

7 голосов
/ 12 апреля 2011

Интерфейсы уровня браузера просто «закрашиваются» на запрос с помощью directlyProvides.Просто сделайте это в настройках теста перед просмотром:

from zope import interface
from jambette.site.interfaces import IJambetteLayer

...

    directlyProvides(request, IJambetteLayer)
...