<p>不能对普通函数执行<code>.assert_called_once_with</code>函数:首先需要用<a href="https://docs.python.org/3/library/unittest.mock.html#unittest.mock.create_autospec" rel="noreferrer"><strong>^{<cd2>}</strong></a>装饰器包装它。例如:</p>
<pre><code><b>import unittest.mock as mock</b>
def rm(filename):
helper(filename, 5)
def helper(filename):
pass
<b>helper = mock.create_autospec(helper)</b>
def test_unix_fs(mocker):
mocker.patch('module.helper')
rm('file')
helper.assert_called_once_with('file', 5)</code></pre>
<p>或更优雅:</p>
<pre><code>import unittest.mock as mock
def rm(filename):
helper(filename, 5)
<b>@mock.create_autospec</b>
def helper(filename):
pass
def test_unix_fs(mocker):
mocker.patch('module.helper')
rm('file')
helper.assert_called_once_with('file', 5)</code></pre>
<p>注意,断言将失败,因为您只使用<code>'file'</code>调用它。所以一个有效的测试是:</p>
<pre><code>import unittest.mock as mock
def rm(filename):
helper(filename, 5)
@mock.create_autospec
def helper(filename):
pass
def test_unix_fs(mocker):
mocker.patch('module.helper')
rm('file')
helper.<b>assert_called_once_with('file')</b></code></pre>
<p><strong>编辑</strong>:如果函数是在某个模块中定义的,则可以在本地将其包装在decorator中。例如:</p>
<pre><code>import unittest.mock as mock
<b>from some_module import some_function</b>
<b>some_function = mock.create_autospec(some_function)</b>
def test_unix_fs(mocker):
some_function('file')
some_function.assert_called_once_with('file')</code></pre>