“function”对象没有属性“assert”“called”“once”“with”

2024-04-28 08:09:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用pytest和pytest模拟运行以下测试

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'

我做错什么了?


Tags: rmtesthelperpytestdefwithunixpass
2条回答

在面向对象的情况下:

class Foo:
    def rm(self, filename):
        self.helper(filename, 5)

    def helper(self, filename, number):
        pass

def test_unix_fs(mocker):
    mocker.patch.object(Foo, 'helper')
    foo = Foo()
    foo.rm('file')
    helper.assert_called_once_with('file', 5)

不能对普通函数执行.assert_called_once_with函数:首先需要用^{}装饰器包装它。例如:

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')

编辑:如果函数是在某个模块中定义的,则可以在本地将其包装在decorator中。例如:

import unittest.mock as mock
from some_module import some_functionsome_function = mock.create_autospec(some_function)

def test_unix_fs(mocker):
    some_function('file')
    some_function.assert_called_once_with('file')

相关问题 更多 >