擅长:python、mysql、java
<p>我使用了Dan Passaro的解决方案,直到我遇到了这个使用<code>patch.object</code>的解决方案,这在我看来更好:</p>
<pre><code>from unittest.mock import patch,
from .. import monkey
[...]
@patch.object(monkey, 'ook', Mock(return_value=None))
def test_run_ook (self, mock_ook):
self.assertIsNone(monkey.ook())
mock_ook.run.assert_called_once_with('')
</code></pre>
<p>优点:</p>
<ul>
<li>不需要<code>__name__ + '.object_to_be_mocked'</code>的样板代码</li>
<li>测试用例的所有依赖项在文件的开头都清楚地声明为<code>import</code>语句。</li>
<li>如果您试图模拟的对象的虚线名称较长(比如“amazon.jungle.monkey.ook”),因此您要编写<code>@patch.object(amazon.jungle.monkey, 'ook', …)</code>,那么您的IDE的静态代码分析可以确保至少<code>amazon.jungle.monkey</code>是一个有效的变量,因为您没有将整个对象写成一个字符串<code>'amazon.jungle.monkey.ook'</code>。</li>
</ul>
<p>缺点:</p>
<ul>
<li>您不能执行<code>from ..monkey import ook</code>,但需要执行<code>from .. import monkey</code>,并通过<code>monkey</code>访问<code>ook</code>,即<code>monkey.ook</code>。如果我需要经常编写这些代码,为了方便起见,我将在测试的开头添加<code>ook = monkey.ook</code>。(甚至是import语句,以防我不需要模拟<code>monkey</code>的这个特殊属性。)</li>
</ul>