【问题标题】:Mocking a function with namespace confusion模拟命名空间混淆的函数
【发布时间】:2020-09-24 03:08:30
【问题描述】:

我正在尝试模拟一个在调用类方法时应该被调用的函数:

# SomeClass.py

from some_module import some_function


class SomeClass:
    
    def some_method(self, *a, **kw):
        ...
        some_function()
        ...
# tests.py

from mock import patch

from some_package.SomeClass import SomeClass


class TestSomeClass:
    
    @patch('SomeClass.some_function')  # <- error
    def test__some_function__called(self, mocked_function):
        ...
        SomeClass().some_method()
        mocked_function.assert_called()

但是,我不断收到错误消息,提示 SomeClass 没有名为 some_function 的方法。

【问题讨论】:

    标签: python python-3.x python-mock


    【解决方案1】:

    问题是由于模块名和类名相同,即SomeClass。这引起了patch 一些混乱。

    解决方案:importlib 的组合并用 Mock() 覆盖导入的模块功能:

    # tests.py
    
    import importlib
    from mock import Mock
    
    from some_package.SomeClass import SomeClass
    
    
    class TestSomeClass:
        
        def test__some_function__called(self):
            some_class_module = importlib('some_package.SomeClass')  # this is the actual module
            some_class_module.some_function = Mock()
            ...
            SomeClass().some_method()
            some_class_module.some_function.assert_called()  # <- no more error - tests pass
    
    

    这就是我解决此问题的方法 - 如果有人有替代解决方案,我会很高兴听到它。希望这对遇到类似问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-09-06
      • 2012-03-29
      • 2014-04-14
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2023-03-14
      • 2012-03-03
      相关资源
      最近更新 更多