【问题标题】:Python unittest mock ... mock a module statementPython unittest mock ... 模拟一个模块语句
【发布时间】:2014-03-01 15:08:03
【问题描述】:

我很难理解 python 的模拟测试方法。

我想对this file 进行一些嘲笑。

由于包 xbmc、xbmcaddon 和 xbmcgui 无法在正常的 python 环境中导入,我设法像这样模拟它们:

class XBMCTestCase(unittest.TestCase):    
    def setUp(self):
        #Mock up any calls to modules that cannot be imported
        self.xbmc = Mock()
        self.xbmcgui = Mock()
        self.xbmcaddon = Mock()

        modules = {
            'xbmc' : self.xbmc,
            'xbmcgui': self.xbmcgui,
            'xbmcaddon': self.xbmcaddon
            }
        self.module_patcher = patch.dict('sys.modules', modules) #@UndefinedVariable
        self.module_patcher.start()

看到它在行动here

所以当我导入 setlocation.py 时,我会收到如下错误:

  File "/home/paulo/workspace/weather.metoffice/src/metoffice/utils/utilities.py", line 21, in <module>
    CACHE_FOLDER = os.path.join(ADDON_DATA_PATH, 'cache')
  File "/usr/lib/python2.7/posixpath.py", line 78, in join
    path +=  b
TypeError: unsupported operand type(s) for +=: 'Mock' and 'str'

即使我模拟了“metoffice.utils”(通过将其添加到安装时创建的补丁中的模块列表中),我在setlocation.py 中也会遇到类似的错误

  File "/home/paulo/workspace/weather.metoffice/src/metoffice/setlocation.py", line 32, in <module>
    GEOIP_PROVIDER = int(__addon__.getSetting('GeoIPProvider'))
TypeError: int() argument must be a string or a number, not 'Mock'

所以我需要__addon__.getSetting() 来返回一个字符串。

有什么想法吗?

所有尝试都失败了,但我认为我没有完全掌握模拟包的功能。

注意,我使用的是 Python 2.7.3,mock 1.0.1

【问题讨论】:

  • __addon__ 来自哪里?如果您已模拟出该对象,则需要确保为 getSetting() 调用设置返回值。

标签: python unit-testing python-2.7 mocking xbmc


【解决方案1】:

您需要告诉您的模拟对象要返回什么。 __addon__ 值是 xbmcaddon.Addon() 调用的结果,因此您可以通过以下方式访问该模拟对象:

addon = self.xbmcaddon.Addon.return_value

因为.return_value 为您提供了调用Addon() 将返回的实际Mock 对象。

现在您可以告诉Mock 对象在调用getSetting() 方法时返回什么;这里需要提供两个值,因此您可以使用 side_effect 设置要返回的值序列:

addon.getSetting.side_effect = ['some_api_key', '42']

第一次调用__addon__.getSetting() 将产生第一个值'some_api_key',第二次调用将产生'42'

【讨论】:

  • 感谢 Martijn 的工作。它仍然让我头疼,因为感觉就像我正在对一个实例进行更改,该实例以某种方式更改了类定义本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2013-12-25
  • 2022-01-05
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多