2013-08-29 6 views
2

Я преследовал проблему с внедрением макета для тестирования функции контроллера Pylons.Использование mock для измельчения импортированного модуля для тестирования функции контроллера Pylons

Конкретная функция Я пытаюсь проверить, можно найти здесь: https://hg.mozilla.org/build/buildapi/file/efe11511f42d/buildapi/controllers/selfserve.py#l210

Объективный:

Я просто пытаюсь издеваться из функций, которые он называет, так что я могу подтвердить, что это в конечном итоге вызывает get_completeness.

выпуска:

я могу издеваться _ok, _get_stable_delay, _failed и _branches_cache просто отлично. Но когда дело доходит до g.buildapi_cache.get_builds_for_revision, я не могу правильно их высмеять, и каждый раз, когда я вызываю ревизию(), она терпит неудачу.

г фактически pylons.app_globals и импортируется в контроллере selfserve.py следующим образом: «из пилонов импорта app_globals как г»

Testing:

Я использую интерпретатор питона, чтобы проверить все это. Эти 2 реализаций я пытаюсь: http://pastebin.mozilla.org/2931825 и http://pastebin.mozilla.org/2931832

В целом здесь полный пробег в интерпретаторе, в комплекте с TraceBack для http://pastebin.mozilla.org/2931825

>>> from buildapi.controllers.selfserve import SelfserveController 
>>> from mock import patch, Mock 
>>> s = SelfserveController() 
>>> s._ok = Mock(name='_ok') 
>>> s._get_stable_delay = Mock(return_value=180) 
>>> s._branches_cache = Mock() 
>>> s._branches_cache = {'try': None} 
>>> s._failed = Mock(return_value="Failed") 
>>> with patch('buildapi.controllers.selfserve.g.buildapi_cache.get_builds_for_revision') as get_builds_for_revision: 
...   get_builds_for_revision.return_value = ['baz', 'bang'] 
...   result = revision('try', 'bar') 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/mock.py", line 1252, in __enter__ 
    self.target = self.getter() 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/mock.py", line 1414, in <lambda> 
    getter = lambda: _importer(target) 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/mock.py", line 1102, in _importer 
    thing = _dot_lookup(thing, comp, import_path) 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/mock.py", line 1089, in _dot_lookup 
    return getattr(thing, comp) 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/paste/registry.py", line 137, in __getattr__ 
    return getattr(self._current_obj(), attr) 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/paste/registry.py", line 197, in _current_obj 
    'thread' % self.____name__) 
TypeError: No object (name: app_globals) has been registered for this thread 

А вот это для http://pastebin.mozilla.org/2931832

>>> from buildapi.controllers.selfserve import SelfserveController 
>>> from mock import patch, Mock 

>>> s = SelfserveController() 
>>> s._ok = Mock(name='_ok') 
>>> s._get_stable_delay = Mock(return_value=180) 
>>> s._branches_cache = Mock() 
>>> s._branches_cache = {'try': None} 
>>> s._failed = Mock(return_value="Failed") 
>>> g = Mock() 
>>> g.buildapi_cache = Mock(name='buildapi_cache') 
>>> g.buildapi_cache.get_builds_for_revision = Mock(name='get_builds_for_revision', return_value=['baz', 'bang']) 
>>> s.revision('try', 'bar') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "buildapi/controllers/selfserve.py", line 217, in revision 
    job_items = g.buildapi_cache.get_builds_for_revision(branch, revision) 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/paste/registry.py", line 137, in __getattr__ 
    return getattr(self._current_obj(), attr) 
    File "/Users/jzeller/buildapi-test/lib/python2.7/site-packages/paste/registry.py", line 197, in _current_obj 
    'thread' % self.____name__) 
TypeError: No object (name: app_globals) has been registered for this thread 

Это та же ошибка, что и я, когда пытаюсь запустить ревизию. Каждый раз, когда он ошибается здесь, потому что моя попытка издеваться над этим модулем app_globals потерпела неудачу, или так кажется. Я действительно не уверен, как еще попробовать это. У кого-нибудь есть идеи?

Вот несколько хороших деталей:

Примечание 1

Я уже рассмотрел следующие темы, которые, похоже, не совсем применимы к этому конкретному сценарию, или я полностью пропущу точку.

ответ

0

Контроллера не может быть использован в качестве независимого объекта без среды Инициализированных пилонов.

Использование функциональности Pylons обеспечивает тестирование, избавляет вас от всего кода шаблона, чтобы протестировать контроллер.

Я рекомендую использовать класс TestController в сочетании с носетистами, как показано в documentation.

Специально для вашего кода, я думаю, что пилоны лечит частных метод (начиная с _) в отличие от общественных методов, так как общие методы работы в контексте запроса.