wro*_*ame 4 django unit-testing
因此,在DeleteView中,GET请求返回一个确认页面,以及一个简单的POST请求,除了csrf_token实际需要的Delete 之外,没有其他字段,而Delete实际获取DeleteView来删除对象,用户将重定向到该对象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>
Run Code Online (Sandbox Code Playgroud)
{% 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
Run Code Online (Sandbox Code Playgroud)
如果尝试print response,我将获得与使用GET请求时相同的准确响应。
似乎在进行单元测试时,无论我尝试在POST请求中发送哪种数据,它都仍然被视为GET请求...
我的基于班级的观点:
class MyclassDelete(DeleteView):
model = myclass
success_url = '/myclass-removed/'
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
是的,这是因为您忘记了将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)
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题。
另外,提示,在单元测试中尝试多次声明每个单元测试被认为是不好的做法。而是尝试将其分解,以便一个测试测试,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)
Run Code Online (Sandbox Code Playgroud)
这样可以简化调试,并且在遇到此类麻烦时有时可以节省时间!
UPDATE意识到我还没有完成一个不错的类来涵盖测试。
| 归档时间: |
|
| 查看次数: |
1859 次 |
| 最近记录: |