我有一个如下模块:
'''example.py'''
from some.module import Session
def init_system():
var_one = Session.query(SQLAModelA).all()
var_two = [(x.attr_B_a, x) for x in Session.query(SQLAModelB).all()]
for value in var_one:
something = value.attr_A_a + value.attr_A_c
# Will do something with var_two etc (which has different attributes)
something_else = [x.attr_B * 2 for x in var_two]
return result
会话是指与数据库对话的 SQLAlchemy 会话处理程序。出于测试目的,我需要能够模拟 Session 对象(或者可能只是 Session 对象?)中的查询方法,这样我就可以init_system
在不与数据库实际交互的情况下进行测试。我如何使用Mock 框架来做到这一点?
真正让我感到困惑的是,如果我模拟该query()
方法,我该如何更改依赖于传递给的类的所有方法的输出query()
?
我希望我可以按照以下方式做一些事情:
def test_init_numbers():
import
my_mock_object = MagicMock()
with patch('some.module.Session.query', my_mock_object):
result = example.init_system()
assert result == ['expected', 'result']
但是,我不知道我需要做什么才能my_mock_object
使其query()
正确模仿。我想它需要实现all()
返回迭代器的方法。而且,我知道我可以在返回的迭代器中创建更多的模拟对象,确保它们具有适当属性的值,例如:
var_one_element_mock = MagicMock(spec=SQLAModelA)
var_one_element_mock.attr_A_a = 12
var_two_element_mock = MagicMock(spec=SQLAModelB)
var_one_element_mock.attr_B = 100
而且,当然,我可以创建MagicMock
可以由 init_system 函数使用的那些对象的不同版本的迭代,例如,for value in var_one
在行中。
但我不知道如何将所有模拟对象拼凑在一起,所以我可以模拟出该Session.query
方法,同时考虑到一个类已传递给它,这会影响它返回的可迭代对象的内容。
谢谢!