“功能”对象没有属性“ assert_drawn_once_with”
问题内容:
我正在尝试使用pytest和pytest_mock运行以下测试
def rm(filename):
helper(filename, 5)
def helper(filename):
pass
def test_unix_fs(mocker):
mocker.patch('module.helper')
rm('file')
helper.assert_called_once_with('file', 5)
但是我有例外 AttributeError: 'function' object has no attribute 'assert_called_once_with'
我究竟做错了什么?
问题答案:
你不能执行.assert_called_once_with
上的功能 香草 功能:首先需要用其包装
mock.create_autospec
装饰。因此,例如:
**import unittest.mock as mock**
def rm(filename):
helper(filename, 5)
def helper(filename):
pass
**helper = mock.create_autospec(helper)**
def test_unix_fs(mocker):
mocker.patch('module.helper')
rm('file')
helper.assert_called_once_with('file', 5)
或更优雅:
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.assert_called_once_with('file', 5)
请注意,断言将失败,因为您只能通过调用断言'file'
。因此有效的测试将是:
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. **assert_called_once_with('file')**
编辑 :如果函数在某个模块中定义,则可以将其包装在本地的装饰器中。例如:
import unittest.mock as mock
**from some_module import some_function**
**some_function = mock.create_autospec(some_function)**
def test_unix_fs(mocker):
some_function('file')
some_function.assert_called_once_with('file')