<p>您需要在导入测试中的模块之前进行模拟。导入模块时将执行模块作用域中的代码。在执行测试用例时,通过decorator进行模拟已经太迟了</p>
<p>例如</p>
<p><code>other_module.py</code>:</p>
<pre class="lang-py prettyprint-override"><code>def funA():
pass
def funB():
pass
</code></pre>
<p><code>fun_list.py</code>:</p>
<pre class="lang-py prettyprint-override"><code>import other_module
print('execute module scope code')
FUN_LIST = [
other_module.funA,
other_module.funB,
]
def run_funs():
for fun in FUN_LIST:
fun()
</code></pre>
<p><code>demo.py</code>:</p>
<pre class="lang-py prettyprint-override"><code>from fun_list import run_funs
def run_demo():
run_funs()
</code></pre>
<p><code>test_demo.py</code>:</p>
<pre class="lang-py prettyprint-override"><code>import unittest
from unittest.mock import patch
class TestDemo(unittest.TestCase):
@patch('other_module.funB')
def test_demo_funs(self, mocked_funB):
print('mock before import the module')
from demo import run_demo
mocked_funB.return_value = {}
run_demo()
assert mocked_funB.called
if __name__ == '__main__':
unittest.main()
</code></pre>
<p>测试结果:</p>
<pre><code>mock before import the module
execute module scope code
.
Ran 1 test in 0.002s
OK
Name Stmts Miss Cover Missing
src/stackoverflow/67563601/demo.py 3 0 100%
src/stackoverflow/67563601/fun_list.py 6 0 100%
src/stackoverflow/67563601/other_module.py 4 1 75% 6
src/stackoverflow/67563601/test_demo.py 12 0 100%
TOTAL 25 1 96%
</code></pre>