我想在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?
谢谢!
答案 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 模型实例并保存它。您可以通过
获取其PKmodel_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)