首页 > 解决方案 > 如何在 Django 中测试创建函数?

问题描述

# my .views
def post_create_view(request):
    form = PostModelForm(request.POST or None)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        form = PostModelForm()
    context = {'form': form}
    return render(request, 'form.html', context)

# my .urls
path('create/', post_create_view, name='create')

# my .test

class TestViews(TestCase):

    def setUp(self):
        self.client = Client()
        self.create_url = reverse('posts:create')
        self.user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
        self.post1 = Post.objects.create(user=self.user, title='testpost', content='fgh')
        self.query = Post.objects.all()

    def test_blog_create_POST(self):
# this is where the error surely is
        response = self.client.post(self.create_url, {'title': 'testpost2', 'content': 'asd'})
        self.assertEqual(response.status_code, 302)
# this is where the test fail
        self.assertEqual(self.query.last().title, "testpost2")

'testpost2' 没有被创建,但我的表单工作正常。如何模拟测试用例中的输入?self.create_url 重定向到正确的 url,即模板中带有表单的那个,这种表单效果很好,但是当我在测试中编写响应时,我作为第二个参数传递的字典似乎没有通过。

标签: djangotesting

解决方案


如果表单无效,它只是在页面上重新呈现表单 - 这会产生状态 200,而不是 302。此外,在表单无效的情况下为什么要发送重定向状态并不明显。

如果此端点仅用于 POST 请求,那么您需要在模板中显示表单错误。或者,如果您认为在您的情况下重定向是一个更好的选择,如果is_valid()返回 false 只需执行redirect


推荐阅读