在Python中模拟导入的类

时间:2018-11-22 14:35:21

标签: python testing

我正在尝试模拟一个类,该类在导入要测试的所述类的模块中调用。

# application.py
from my_module.my_submodule import MyClass

def my_function(var1):
    instance = MyClass()

    instance.some_function(var1)

和我的测试文件

# test_application.py
import mock
import application

def test_my_function():
    with mock.patch('my_module.my_submodule.MyClass') as MockClass:
        application.my_function(var1)

        MockClass.assert_called()        

这会导致错误,提示未调用MockClass

现在,通过查看以下问题:Why python mock patch doesn't work?,我得到了启发,将application.py导入更改为此

# application.py
import my_module.my_submodule as mysub

def my_function(var1):
    instance = mysub.MyClass()

    instance.some_function(var1)

也就是说,我不会直接导入要在测试中模拟的类。现在可以了。

我的问题是,这是否按预期工作,或者我以原始方式做错了什么?如果我想模拟要测试的模块中使用的类,是否真的有必要总是这样导入模块?

1 个答案:

答案 0 :(得分:1)

是的,它按预期工作,但是您修补了错误的目标。 尝试修补application.MyClass

application不在任何地方使用my_module.my_submodule.MyClass, 但是使用MyClass别名。