Django测试DeleteView

时间:2013-04-15 01:36:23

标签: django unit-testing

因此,在DeleteView中,GET请求返回一个确认页面,除csrf_token之外没有任何字段的简单POST请求实际上获取DeleteView以删除该对象,用户将该对象重定向到{ {1}}。

如何测试此功能?在我的success_url文件中,我基本上有:

myclass_confirm_delete.html

其中<form action="{% url 'remove_myclass' object.id %}" method="post"> {% csrf_token %} <p>Are you sure you want to remove {{ object.name }}?</p> <input type="submit" value="Yes" class="btn btn-primary" /> </form> 是同一页面的网址。它适用于我的浏览器。当我单击“是”时,它会将我重定向到成功页面,并从数据库中删除{% url 'remove_myclass' object.id %}对象。

现在我正尝试使用单元测试自动测试。我基本上试试

myclass

如果我尝试response = self.client.get(reverse('remove_myclass', args=(myobject.id,)), follow=True) self.assertContains(response, 'Are you sure you want to remove') # THIS PART WORKS self.client.post(reverse('remove_myclass', args=(myobject.id,)), follow=True) self.assertRedirects(response, reverse('myclass_removed'), status_code=302) # FAILS; status code is 200 ,我会得到与使用GET请求时相同的确切响应。

似乎在单元测试时,无论我尝试在POST请求中发送什么类型的数据,它仍然被视为GET请求......

我基于班级的观点:

print response

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

是的,这是因为您忘记将post请求分配给response,因此您要检查两次相同的响应。

response = self.client.get(reverse('remove_myclass', args=(myobject.id,)), follow=True)
self.assertContains(response, 'Are you sure you want to remove') # THIS PART WORKS

post_response = self.client.post(reverse('remove_myclass', args=(myobject.id,)), follow=True)
self.assertRedirects(post_response, reverse('myclass_removed'), status_code=302)

这应该可以解决问题。

此外,只是一个提示,尝试在单元测试中不止一次断言被认为是单元测试时的不良做法。而是尝试将其分解,以便一个测试测试GET并在测试测试POST

from django.test import TestCase

class TestDifferentRequestMethods(TestCase):

    def test_my_get_request(self):
        response = self.client.get(reverse('remove_myclass', args=(myobject.id,)), follow=True)
        self.assertContains(response, 'Are you sure you want to remove') # THIS PART WORKS

    def test_my_post_request(self):
        post_response = self.client.post(reverse('remove_myclass', args=(myobject.id,)), follow=True)
        self.assertRedirects(post_response, reverse('myclass_removed'), status_code=302)

这使得调试变得更容易,并且在遇到这些麻烦时有时可以节省!

UPDATE 意识到我还没有完成一个很好的课程来包含测试。