python - 您如何测试包含在所述函数中实例化的模拟对象的函数?
问题描述
在测试/模拟方面我仍然是绿色的,我今天一直在努力解决这个问题。
在文件.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()
。我该如何正确处理这个?或者这是一起处理这一切的错误方法?谢谢!
解决方案
所以你几乎有正确的答案,问题是当你实例化一个Mock
对象时,它返回一个新对象。
return_value:调用mock时返回的值。默认情况下,这是一个新的 Mock(在首次访问时创建)。请参阅 return_value 属性。
这意味着当调用以下行时,它会返回一个新Mock
对象。
f = FileImporter(file)
然而,测试正在测试原始Mock
对象。为了解决这个问题,我们可以将return_value
Mock 对象设置为自身,这样我们就可以测试原始修补对象。
@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()
推荐阅读
- python - Python:单行字符串
- date - 在后台每 24 小时更改一次计时器的更好方法 - SwiftUI
- r - R中一种情节的推荐
- sql - 如何根据两个列值是否“跨越”另一个表中的任何值进行过滤?
- wordpress - Mailchimp - 并排表格
- c# - 如何使用 C# 进入 Microsoft.Office.Interlop.Word Mailmerge 上的 NextRecord?
- java - 运行来自多个 If Else 语句时的多个结果
- python - 类型错误:__init__() 缺少 1 个必需的位置参数:'args'
- firebase - 逆向工程实体关系图
- php - 在管理订单列表 prestashop 1.7.7.5 中添加运营商列