2013-08-29 1 views
2

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:

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.

Répondre

0

Un dispositif de commande ne pouvait pas être utilisé comme un objet indépendant sans l'environnement d'un pylônes initialisés.L'utilisation de la fonctionnalité Pylons pour les tests vous permet d'économiser tout le code standard pour tester un contrôleur.

Je vous recommande d'utiliser la classe TestController en combinaison avec nosetests comme indiqué dans documentation.

Plus précisément votre code, je pense que Pylônes traite méthodes privées (en commençant par _) différemment des publics méthodes parce que les méthodes publiques gérées dans le cadre d'une demande.

Questions connexes