使用mock模拟一个用于测试电缆塔控制器功能的导入模块

2024-09-29 23:33:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找一个问题,实现mock来测试一个Pylons控制器的功能。在

我要测试的特定函数可以在这里找到:https://hg.mozilla.org/build/buildapi/file/efe11511f42d/buildapi/controllers/selfserve.py#l210

目标:

我只是试着模拟它调用的函数,这样我就可以确认它最终调用get_的完整性。在

问题:

我可以模仿“好的”、“稳定的”延迟、“失败的”和“分支”的缓存。但说到g.buildapi_cache.get_构建用于修订的,我似乎无法正确地嘲笑它,每次调用revision()时,它都会失败。在

g实际上是pylons.app_globals公司并在自助服务.py控制器如下:'从塔架导入应用程序_globals as g'

测试:

我使用python解释器来测试所有这些。这是我正在尝试的两种实现:http://pastebin.mozilla.org/2931825和{a3}

总而言之,这里是解释器的完整运行,完成了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

^{pr2}$

这是我在尝试运行修订版时遇到的相同错误。每次它在这里出错是因为我试图模仿这个app_globals模块失败了,或者看起来是这样。我真的不知道该怎么做。有人有什么想法吗?

以下是一些更好的细节:

注1

我已经看了下面的线程,这些线程似乎不太适用于这个特定的场景,或者我完全没有抓住要点。在


Tags: inpyorgtestmozillagetlibpackages
1条回答
网友
1楼 · 发布于 2024-09-29 23:33:33

没有初始化的Pylons环境,控制器不能用作独立对象。在

使用Pylons提供的用于测试的功能,可以省去测试控制器的所有样板代码。在

我建议您将TestController类与nosetests结合使用,如documentation所示。在

特别是对于您的代码,我认为Pylons对待private方法(以_u开头)与public方法不同,因为公共方法在请求的上下文中运行。在

相关问题 更多 >

    热门问题