【发布时间】:2016-12-18 01:59:59
【问题描述】:
假设我有一个Article 模型,如下所示:
from django.db import models
class Article(models.Model):
author = models.CharField(max_length=100)
title = models.CharField(max_length=200)
body = models.TextField()
与我的实际使用相比,这非常简单(author 应该是另一个模型的ForeignKey,等等),但是这样更清楚。
假设我想列出某些作者的所有文章的标题,但将每个作者的文章放在一起。它可以表示为列表列表:
def get_beatles_articles_titles():
beatles = [
"John Lennon",
"Paul McCartney",
"George Harrison",
"Ringo Starrr",
]
return [article.author for author in beatles
for article in Article.objects.filter(author=author)]
哦,嵌套列表推导式,所以我们的方法没那么简单。这里的某个地方很有可能存在错误,所以我们应该以某种方式对其进行测试!最简单的解决方案似乎是为每个作者创建一些 Article 实例(并将它们保存在数据库中)并检查它们是否都被正确获取。
from django.test import TestCase
from models import Article
from views import get_beatles_articles_titles
class ArticlesTitlesTestCase(TestCase):
def test_that_every_beatles__article_is_fetched(self):
Article.objects.create(author="John Lennon", title="John's")
Article.objects.create(author="Paul McCartney", title="Paul's")
Article.objects.create(author="George Harrison", title="George's")
Article.objects.create(author="Ringo Starr", title="Ringo's")
self.assertEqual(get_beatles_articles_titles(), [
["John's"],
["Paul's"],
["George's"],
["Ringo's"]
])
运行该测试,我们可以看到我们的原始代码中有一个错字,因此证明了它的用处。
但是,访问数据库不赞成模拟事物(难怪,我经历过时间差异可能很大)。在上面的测试中可以嘲笑什么?我特别担心我的.filter 查询的正确性(它可能会变得相当复杂),所以我不想猜测QuerySets 数据库会给我。
理想情况下,我想使用这样的东西(伪代码如下):
johns_article = Article(author="John Lennon")
fake_query = MockQuery(author__contains="John")
assertTrue(fakeQuery.contains(johns_article))
【问题讨论】:
标签: unit-testing python-3.x mocking django-queryset django-unittest