gpt4 book ai didi

python - 如何在python中模拟链式函数调用?

转载 作者:IT老高 更新时间:2023-10-28 21:12:52 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com