因此,在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
有什么想法吗?
答案 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 意识到我还没有完成一个很好的课程来包含测试。