如何测试Django CreateView?

时间:2017-11-04 14:29:46

标签: python django django-testing

我想在Django上练习测试,我有一个想要测试的CreateView。该视图允许我创建一个新帖子,我想检查它是否可以找到没有发布日期的帖子,但首先我要测试发布日期的帖子只是为了习惯语法。这就是我所拥有的:

import datetime
from django.test import TestCase
from django.utils import timezone
from django.urls import reverse
from .models import Post, Comment

# Create your tests here.
class PostListViewTest(TestCase):

    def test_published_post(self):
        post = self.client.post('/post/compose/', {'author':"manualvarado22", 'title': "Super Important Test", 'content':"This is really important.", 'published_date':timezone.now()})
        response = self.client.get(reverse('blog:post_detail'))
        self.assertContains(response, "really important")

但我明白了:

django.urls.exceptions.NoReverseMatch: Reverse for 'post_detail' with no 
arguments not found. 1 pattern(s) tried: ['post/(?P<pk>\\d+)/$']

如何获取新创建的帖子的pk?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以直接从数据库中获取它。

注意,您不应该在测试中调用两个视图。每个测试应该只调用它实际测试的代码,因此这应该是两个单独的视图:一个用于调用create视图并断言该条目位于db中,另一个用于直接创建条目,然后调用详细视图检查它是否显示。所以:

def test_published_post(self):
    self.client.post('/post/compose/', {'author':"manualvarado22", 'title': "Super Important Test", 'content':"This is really important.", 'published_date':timezone.now()})
    self.assertEqual(Post.objects.last().title, "Super Important Test")

def test_display_post(self):
    post = Post.objects.create(...whatever...)
    response = self.client.get(reverse('blog:post_detail', pk=post.pk))
    self.assertContains(response, "really important")

答案 1 :(得分:1)

您想要测试的是使用可靠的Django Databse API来接收创建的数据并查看您的视图是否代表了这些数据。

因为您只创建 1 模型实例并保存它。您可以通过

获取其PK
model_pk = Post.objects.get(author="manualvarado22").pk

然后应该在Exception状态下将此pk插入到您的URL中。

但我也建议使用abseconded test,直接通过django model API检查数据库中是否存在新创建的“Post”。 编辑:

在测试时,django或您正在使用的测试模块会创建一个干净的数据库,仅用于测试并在测试运行后销毁它。因此,如果要在测试时访问用户,则必须在“测试”设置或“测试”方法本身中创建用户。否则,Usertable将为空。

答案 2 :(得分:1)

由于你的出色答案以及一些额外的SO研究,我终于能够解决这个问题了。这就是测试的样子:

let a = parseInt(Math.random() * 10000);
let b = parseInt(Math.random() * 10000);
let c = parseInt(Math.random() * 10000);
let max = _.max([a,b,c])
console.log(max)

这是创建和详细视图:

def test_display_no_published_post(self):
        test_user = User.objects.create(username="newuser", password="securetestpassword")
        post = Post.objects.create(author=test_user, title="Super Important Test", content="This is really important.")
        response = self.client.get(reverse('blog:post_detail', kwargs={'pk':post.pk}))
        self.assertEqual(response.status_code, 404)