sqlalchemy和pytest补丁的模拟过滤器参数

时间:2019-01-24 13:18:24

标签: python-3.x pytest python-unittest

我想编写一个测试用例来模拟filter()的sqlalchemy。在这里使用session来触发对Object的查询.session正在配置文件中创建。我能够模拟session.query(FleetEquipment)但我也该如何模拟filter参数。

def get_fleet_equipment_from_thirdparty(self, unit_address, thirdparty_company_id):
            result = session.query(FleetEquipment).filter(
                FleetEquipment.ThirdPartyUnitNumber == unit_address
                and FleetEquipment.ThirdPartyCompanyID == thirdparty_company_id)[:]

我嘲笑session.query参数是

@patch("dao.db_config.session.query",fleetEquipmentMock)

这就是我创建此模拟对象的方式

fleetEquipment = FleetEquipment(1,123,3,1,1,1)
fleetEquipmentMock = Mock()
fleetEquipmentMock.return_value = fleetEquipment

我怎么能达到同样的目的。

如果我尝试一起模拟所有东西

@patch("dao.db_config.session.query.filter",fleetEquipmentMock)

观察到以下异常:

AttributeError: <bound method Session.query of <sqlalchemy.orm.session.Session object at 0x00000239F059E198>> does not have the attribute 'filter'

1 个答案:

答案 0 :(得分:0)

我的方式是:

mock = MagicMock(name="mock")
@patch('dao.db_config.session.query',return_value=mock)
def get_fleet_equipment_from_thirdparty_test(self):
    mock.filter.return_value=MagicMock(name="filter")
    assert None==FleetEquipmentService.get_fleet_equipment_from_thirdparty(None,'123',3)
get_fleet_equipment_from_thirdparty_test()

但是它会得到更多的改进/重构。请让我知道您的想法。我会对其进行完善。

相关问题