Django用mock编写单元测试

2024-05-23 19:00:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始做Django项目。首先,我阅读了book on TDD with Python和官方文档(对于tests)。还有一些博客。在

我注意到的一件事是,他们编写访问数据库模型的测试。考虑以下来自here的片段

def test_home_page_can_save_a_POST_request(self):
    request = HttpRequest()
    request.method = 'POST'
    request.POST['item_text'] = 'A new list item'

    response = home_page(request)

    self.assertEqual(Item.objects.count(), 1)
    new_item = Item.objects.first()
    self.assertEqual(new_item.text, 'A new list item')

测试断言Item对象的数目是否为1。所以测试实际上是从数据库中添加和检索数据。这不会让测试变慢吗?在

如果测试是并行的,如果有另一个测试添加了Item对象,这个测试用例可能会失败,对吗?在

修补方法/对象如何?上面的代码片段可以这样重构

^{pr2}$

我是Django的新手,我不熟悉这些做法。我访问的教程编写了与数据库对话的测试。我想知道,这是否是Django项目测试的惯例。第二个片段(使用补丁和mock)在Django生态系统中是否完美?在

Edit:与Forms以及Mocking form.is_valid方法相同,以返回True或{},前提是表单有单独的单元测试。在

《Python的p.S.TDD》是一本很棒的书,它帮助我在入职培训方面有了很大的帮助。我绝对推荐给任何学习Django的人。在


Tags: 项目对象djangotextself数据库homenew
1条回答
网友
1楼 · 发布于 2024-05-23 19:00:16

如果你想测试你的模型,你很难绕过数据库,是的,它确实可以让测试变得更慢,即使使用内存中的SQLite数据库——这可能会导致其他问题FWIW,因为SQLite不是PostgreSQL之类的东西的透明替代品。在

但是假设您在视图中调用的任何模型或其他函数/对象/方法都有自己的unittest,并且您只想检查您的视图是否执行了预期的调用,那么mocking是一种可行的策略-实际上可能比测试预期调用的结果更明智(这通常会将单元测试转换为集成测试)。在

相关问题 更多 >