J'ai été la poursuite d'un problème avec l'implémentation de simulation pour tester une fonction de contrôleur Pylons.Utilisation de simulacre pour simuler un module importé pour tester une fonction de contrôleur Pylons
La fonction particulière que je suis en train de tester se trouve ici: https://hg.mozilla.org/build/buildapi/file/efe11511f42d/buildapi/controllers/selfserve.py#l210
L'objectif:
J'essaie simplement de se moquer des fonctions qu'il appelle pour que je puisse confirmer qu'il appelle finalement get_completeness.
La question:
Je moquer _OK, _get_stable_delay, _failed et _branches_cache très bien. Mais quand il s'agit de g.buildapi_cache.get_builds_for_revision, je ne peux pas sembler me moquer correctement, et chaque fois que j'appelle revision(), il échoue.
g est en fait pylons.app_globals et est importé dans le contrôleur de selfserve.py comme ceci: 'de pylones importer app_globals comme g'
Test:
J'utilise un interpréteur Python pour tester tout ça. Ce sont les 2 mises en œuvre, je suis en train: http://pastebin.mozilla.org/2931825 et http://pastebin.mozilla.org/2931832
Dans l'ensemble ici est la course complète dans l'interpréteur, avec retraçage pour 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
Et là, il est pour 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
C'est la même erreur que j'ai eue lorsque j'ai essayé d'exécuter la révision. Chaque fois qu'il fait des erreurs ici parce que ma tentative de se moquer de ce module app_globals a échoué, ou semble-t-il. Je ne suis vraiment pas sûr de savoir comment essayer cela. Est-ce que quelqu'un a des idées?
Voici quelques autres bons détails:
- Voici la fonction que je tente d'utiliser, ce qui est dans la classe que je suis l'instanciation: https://hg.mozilla.org/build/buildapi/file/efe11511f42d/buildapi/controllers/selfserve.py#l210
Note 1
J'ai déjà regardé les sujets suivants qui ne semblent pas vraiment s'appliquer à ce scénario spécifique, ou je manque complètement le point.