首页 > 解决方案 > 您如何测试包含在所述函数中实例化的模拟对象的函数?

问题描述

在测试/模拟方面我仍然是绿色的,我今天一直在努力解决这个问题。

在文件.py...

class FileImporter:
    
    def __init__(self, file=None):
        self.file = file
        
    def process_file(self):
        # process file here...


def import_file(file):
    f = FileImporter(file)
    f.process_file()
    return file

然后在 test.py...

import mock
import pytest

from file import import_file

@mock.patch('file.FileImporter')
def test_import_file(m_importer):
    
    result = import_file('test.csv')
    m_importer.assert_called_with('test.csv')
    m_importer.process_file.assert_called_once()
    

上面的测试通过m_importer.assert_called_with('test.csv')但失败了m_importer.process_file.assert_called_once()。我该如何正确处理这个?或者这是一起处理这一切的错误方法?谢谢!

标签: pythonmockingpytest

解决方案


所以你几乎有正确的答案,问题是当你实例化一个Mock对象时,它返回一个新对象

return_value:调用mock时返回的值。默认情况下,这是一个新的 Mock(在首次访问时创建)。请参阅 return_value 属性。

这意味着当调用以下行时,它会返回一个新Mock对象。

f = FileImporter(file)

然而,测试正在测试原始Mock对象。为了解决这个问题,我们可以将return_valueMock 对象设置为自身,这样我们就可以测试原始修补对象。

@mock.patch('file.FileImporter')
def test_import_file(m_importer):
    # when instantiated the Mock object will return itself as opposed to a new
    # instance of a Mock
    m_importer.return_value = m_importer
    
    result = import_file('test.csv')
    m_importer.assert_called_with('test.csv')
    m_importer.process_file.assert_called_once()

推荐阅读