Я преследовал проблему с внедрением макета для тестирования функции контроллера 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 потерпела неудачу, или так кажется. Я действительно не уверен, как еще попробовать это. У кого-нибудь есть идеи?
Вот несколько хороших деталей:
- Вот функция, я пытаюсь использовать, что в классе я инстанцировании: https://hg.mozilla.org/build/buildapi/file/efe11511f42d/buildapi/controllers/selfserve.py#l210
Примечание 1
Я уже рассмотрел следующие темы, которые, похоже, не совсем применимы к этому конкретному сценарию, или я полностью пропущу точку.