簡體   English   中英

使用模擬來模擬導入的模塊以測試Pylons控制器功能

[英]Using mock to mock an imported module for testing a Pylons controller function

我一直在追求實現模擬以測試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時,我似乎無法正確地模擬它,並且每次我調用version()時,它都會失敗。

g實際上是pylons.app_globals,並以如下方式在selfserve.py控制器中導入:'從pylons中將app_globals導入為g'

測試:

我正在使用python解釋器來測試所有這些。 這些是我正在嘗試的2種實現: http : //pastebin.mozilla.org/2931825http://pastebin.mozilla.org/2931832

總而言之,這是解釋器中的完整運行,並帶有Traceback for 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

我已經看過以下線程,這些線程似乎不適用於此特定方案,否則我將完全忽略這一點。

如果沒有初始化的Pylons環境,則不能將控制器用作獨立對象。

使用Pylons提供的測試功能可以避免所有樣板代碼來測試控制器。

我建議您將TestController類與鼻子測試結合使用,如文檔所示。

專門針對您的代碼,我認為Pylons對私有方法(以_開頭)與公共方法的區別在於,因為公共方法在請求的上下文中運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM