我想编写一个测试用例来模拟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'
答案 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()
但是它会得到更多的改进/重构。请让我知道您的想法。我会对其进行完善。