首页 > 解决方案 > 模拟多参数函数,如何指定规格?

问题描述

我相信我的问题可能是我没有为补丁方法提供规范参数。您可以看到 autospec 也不起作用。注释行和未注释行都给出相同的结果。并且搜索“python模拟参数规范”并没有帮助,因为“规范”这个词太笼统了......

我有一个要测试的功能:

% cat fixTextFiles.py:

import os

from unittest.mock import patch

def fixFile(tables, dir, filename):
    [...]
    return None

还有一个我正在尝试编写的测试:

import os
import tableColumns

import unittest

import fixTextFiles

from unittest.mock import create_autospec

def test_fix_files(mocker):

    rootdir = 'data_20209999/CalAccess/DATA/'
    files = [rootdir + 'TEXT_MEMO.TSV', rootdir + 'SMRY.TSV']

    mocker.patch('os.listdir', return_value=files)

    mocker.patch('fixTextFiles.fixFile', return_value=None, autospec=True)
    #mock_function = create_autospec('fixTextFiles.fixFile', return_value=None)

    fixTextFiles.fixFiles(tableColumns.readTableColumns(), 'data_20209999/CalAccess/DATA', 'TEXT_MEMO.TSV')

结果:

============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-6.0.0, py-1.9.0, pluggy-0.13.1
rootdir: /Users/ray/Projects/CalAccessImpls/open_calaccess_data_py
plugins: mock-3.2.0
collected 3 items

fetchSoSData_test.py ..                                                  [ 66%]
fixTextFiles_test.py F                                                   [100%]

=================================== FAILURES ===================================
________________________________ test_fix_files ________________________________

mocker = <pytest_mock.plugin.MockFixture object at 0x109623e80>

    def test_fix_files(mocker):
    
        rootdir = 'data_20209999/CalAccess/DATA/'
        files = [rootdir + 'TEXT_MEMO.TSV', rootdir + 'SMRY.TSV']
    
        mocker.patch('os.listdir', return_value=files)
    
        mocker.patch('fixTextFiles.fixFile', return_value=None, autospec=True)
        #mock_function = create_autospec('fixTextFiles.fixFile', return_value=None)
    
>       fixTextFiles.fixFiles(tableColumns.readTableColumns(), 'data_20209999/CalAccess/DATA', 'TEXT_MEMO.TSV')
E       TypeError: fixFiles() takes 1 positional argument but 3 were given

fixTextFiles_test.py:21: TypeError
=========================== short test summary info ============================
FAILED fixTextFiles_test.py::test_fix_files - TypeError: fixFiles() takes 1 p...
========================= 1 failed, 2 passed in 0.24s ==========================

标签: pythonpytestpython-mock

解决方案


是的,这是飞行员错误的一个非常愚蠢的例子......


推荐阅读