Python 如何使用模拟框架更改模拟方法的输出?

Python 如何使用模拟框架更改模拟方法的输出?,python,unit-testing,mocking,sqlalchemy,python-mock,Python,Unit Testing,Mocking,Sqlalchemy,Python Mock,我有如下模块: '''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.a

我有如下模块:

'''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
Session是指与DB对话的SQLAlchemy会话处理程序。出于测试目的,我需要能够模拟Session对象中的查询方法(或者可能只是Session对象?),这样我就可以测试
init\u系统
,而不需要它实际与数据库交互。我该如何使用来执行此操作

真正让我困惑的是,如果我模拟
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']
但是,我不知道我需要做什么来
我的\u mock\u对象
,使其正确模拟
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
对象的iterables,这些对象可以由init_系统函数使用,例如,在
for value in var_one
行中

但我不知道如何将所有模拟对象组合在一起,这样我就可以模拟
Session.query
方法,同时考虑到传递给它的类会影响它返回的iterable的内容


谢谢

我不知道您是否还需要这方面的帮助,但是如果您想控制调用MagicMock对象时发生的事情,可以传递一个函数作为其副作用参数。 这样的办法应该行得通

def test_init_numbers():
    import
    my_mock_object = MagicMock()
    def return_iterator():
      ## create and return your iterator here

    my_mock_object.all = MagicMock(side_effect=return_iterator)
    with patch('some.module.Session.query', my_mock_object):
        result = example.init_system()
        assert result == ['expected', 'result']

谢谢你的回答。这很有用,但我认为问题仍然在于区分副作用迭代器的输出,这取决于传递到
query()
的类的类型。