作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用 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)
我很确定问题是在调用 .filter() 后初始 query_mock 正在返回一个新模拟,但我不知道如何捕获该新模拟并确保调用 .distinct()就可以了。
有没有更好的方法来测试我想要得到的东西?我正在尝试确保调用了正确的查询。
最佳答案
每个模拟对象都持有它在调用时返回的模拟对象。您可以使用模拟对象的 return_value 属性来获取它。
对于你的例子,
self.assertTrue(query_mock.distinct.called)
distinct 没有在你的 mock 上调用,它是在你的 mock 的 filter 方法的返回值上调用的,所以你可以通过这样做来断言 distinct 被调用:
self.assertTrue(query_mock.filter.return_value.distinct.called)
关于python - 如何在python中模拟链式函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3813688/
我是一名优秀的程序员,十分优秀!