Как получить доступ к представлениям, определенным с помощью определенного слоя браузера [plone.] в тестовых примерах

#testing #plone

#тестирование #plone

Вопрос:

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

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

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

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

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

Автор, похоже, создал пользовательский файл ZCML для теста, в котором атрибут layer =»…» был удален. (это сработало бы, но кажется очень плохим поддерживать отдельный файл 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())
  

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

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

Ответ №1:

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

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

...

    directlyProvides(request, IJambetteLayer)
  

Комментарии:

1. Кстати, на случай, если это кому-нибудь пригодится, я должен был получить запрос от self.portal. ЗАПРОС в моем тестовом примере.