导入时模拟全局函数调用

时间:2019-12-18 14:46:50

标签: python python-unittest python-mock python-unittest.mock

假设我有一个名为a.py的文件,其代码类似于

import mod1
mod1.a()

def b():
   print("hi")

现在,如果我想模拟乐趣b(),然后unittest.py,同时在顶部使用import语句,例如

from a import b

导入时将调用

mod1.a()。如何模拟导入时发生的调用。

1 个答案:

答案 0 :(得分:2)

考虑将代码移到受其保护的块中,以从模块顶层删除代码。

if __name__ == '__main__':
    mod1.a()
    ... # the rest of your top level code

这样,只有直接运行时,受保护的代码才不会在导入时执行。

如果您仍然需要那里的电话并且想模拟它,这非常简单。 对于这样的文件,

# mod.py

import mod1
mod1.a()

def b():
   print("hi")


# mod1.py

def a():
    print('Running a!')

# test_1.py
# Note: do not call unittest.py to a file.
# That is the name of a module from the Python stdlib,
# you actually need to use it and things will not work,
# because Python tries to load your file not the library you need.

from unittest.mock import patch

with patch('mod1.a') as mock_a:
    ... # configure mock_a here if there is a need, for example
        # to set a fake a call result
    import mod
    ... # the rest of your testing code. Use `mock_a` if you want to
        # inspect `a` calls.

mod1.a之外的不再被嘲笑。 还有其他启动和停止模拟的方法,您应该查看文档。在学习模拟之前,请确保您了解单元测试的工作原理以及如何组织测试。