“功能”对象没有属性“ 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')