【发布时间】:2011-04-18 08:10:17
【问题描述】:
我正在使用 Michael Foord 编写的 mock 库来帮助我在 django 应用程序上进行测试。
我想测试我是否正确设置了我的查询,但我认为我不需要实际访问数据库,所以我试图模拟查询。
我可以很好地模拟查询的第一部分,但是当我链接其他内容时,我没有得到我想要的结果。
功能:
@静态方法 def get_policies(policy_holder, current_user): 如果 current_user.agency: 返回 Policy.objects.filter(policy_holder=policy_holder, version__agency=current_user.agency).distinct() 别的: 返回 Policy.objects.filter(policy_holder=policy_holder)我的测试:第一个断言通过,第二个失败。
def should_get_policies_for_agent__user(self): 使用 mock.patch.object(policy_models.Policy, "objects") 作为 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, [("过滤器", (), { 'policy_holder': "policy_holder", 'version__agency': user_mock.agency, })]) self.assertTrue(query_mock.distinct.call)我很确定问题是在调用 .filter() 后初始 query_mock 正在返回一个新模拟,但我不知道如何捕获该新模拟并确保调用 .distinct()就可以了。
有没有更好的方法来测试我想要得到的东西?我正在尝试确保调用了正确的查询。
【问题讨论】:
-
请不要浪费时间模拟 Django 查询。只需创建一个“夹具”并针对您的夹具数据运行真正的查询。它更简单,并产生更有用的测试结果。
-
@S.Lott 您有多少个测试以及它们运行需要多长时间?
-
@S.Lott 在 39 个测试中,你有多少个夹具?等待这么少的测试,一分半钟的时间似乎很长。当然,您可以运行一个子集,但是当您返回运行所有子集时,我无法等待 12 分钟。我喜欢在提交之前看到所有测试都通过,如果我必须等待 12 分钟,我将停止一起运行测试,这意味着构建损坏。模拟掉外部依赖项(包括数据库)对于单元测试至关重要。
-
@S.Lott 我同意编写测试非常重要,但它们不应减慢开发速度。没有人应该“在测试运行时保持耐心”,我应该能够快速运行测试,看到它们通过,提交并快速进行下一个事情。考虑到如果您删除外部依赖项,它们可以在更短的时间内完成,因此等待大型测试套件运行会大大降低节奏。我完全赞成使用夹具和实际的外部依赖项,但不是在单元测试设置中。
-
“但他们不应该减慢开发速度”。他们没有。我不太确定你在说什么。我的机器一次做不止一件事。我发现我可以在测试运行时编写文档。也许您需要一个允许多任务处理的操作系统?此外,由于我经常使用子集测试,我可以在测试另一件事的同时处理一件事。我想您的测试可能会非常缓慢并占用您的整个机器。我发现采用默认值非常有效,并且使用 Django 框架(带有固定装置)进行测试非常简单和快速。