我正在使用mock http://www.voidspace.org.uk/python/mock/由 Michael Foord 编写的库,用于帮助我在 django 应用程序上进行测试。
我想测试我是否正确设置了查询,但我认为我不需要实际访问数据库,因此我尝试模拟查询。
我可以很好地模拟查询的第一部分,但是当我链接其他内容时,我没有得到我想要的结果。
功能:
@staticmethod
def get_policies(policy_holder, current_user):
if current_user.agency:
return Policy.objects.filter(policy_holder=policy_holder, version__agency=current_user.agency).distinct()
else:
return Policy.objects.filter(policy_holder=policy_holder)
我的测试:第一个断言通过,第二个断言失败。
def should_get_policies_for_agent__user(self):
with mock.patch.object(policy_models.Policy, "objects") as query_mock:
user_mock = mock.Mock()
user_mock.agency = "1234"
policy_models.Policy.get_policies("policy_holder", user_mock)
self.assertEqual(query_mock.method_calls, [("filter", (), {
'policy_holder': "policy_holder",
'version__agency': user_mock.agency,
})])
self.assertTrue(query_mock.distinct.called)
我很确定问题是初始 query_mock 在调用 .filter() 后返回一个新的模拟,但我不知道如何捕获该新模拟并确保在其上调用 .distinct() 。
有没有更好的方法来测试我想要达到的目标?我试图确保正在调用正确的查询。