Django 测试客户端 post 数据
Django test client post data
感谢 Thaian,通过在 'test_create' 函数的开头添加登录,问题已解决,因为您需要在此站点登录才能使用 createview
我目前正在为 createview 编写测试,但我无法向其 post 数据。
被测对象有以下型号
class Role(models.Model):
name = models.CharField(max_length=255)
linked_tenant = models.ForeignKey(Tenant, blank=True, null=True)
并在以下(通用)视图中使用
class RolCreate(TenantRootedMixin, CreateView):
model = RolTemplate
form_class = RoleForm
def get_form_kwargs(self):
kwargs = super(RolCreate, self).get_form_kwargs()
kwargs['linked_tenant'] = self.request.tenant
return kwargs
def form_valid(self, form):
form.instance.linked_tenant = self.kwargs.get('tenant')
return super(RolCreate, self).form_valid(form)
def get_success_url(self, **kwargs):
return reverse('rol_list', args=[self.request.tenant.slug])
这是我正在使用的测试。
class RolCreate_tests(TestCase):
def setUp(self):
self.tenant = get_tenant()
self.role = get_role(self.tenant)
self.client = Client(HTTP_HOST='tc.tc:8000')
self.user = get_user(self.tenant)
def test_create(self):
response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'})
self.assertEqual(response.status_code, 302)
test_against = Role.objects.get(name='new_object')
self.assertEqual(test_against, self.tenant)
抛出错误的断言是最后的'get'请求。
DoesNotExist: Role matching query does not exist.
因此未创建对象,但测试确实验证了 302 视图,这意味着正在创建 post。我不明白为什么这个测试没有做它应该做的。有人可以帮我吗?
=====
经过泰国人的建议,我得到了以下值:
(Pdb) print(self.client.post)
<bound method Client.post of <django.test.client.Client object at 0x10f20da50>>
Pdb) response
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/?next=/my/role/create/">
(Pdb) print(response)
Vary: Cookie
Content-Length: 0
Content-Type: text/html; charset=utf-8
Location: /accounts/login/?next=/my/role/create/
您是否打印了响应并检查了 return 可能是什么?
好主意是 运行 使用 PDB 进行测试。
def test_create(self):
response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'})
import pdb; pdb.set_trace()
self.assertEqual(response.status_code, 302)
test_against = Role.objects.get(name='new_object')
self.assertEqual(test_against, self.tenant)
在您的测试中添加 import pdb;pdb.set_trace() 然后检查 self.client.post()。
所以请粘贴回复包含的内容。
感谢 Thaian,通过在 'test_create' 函数的开头添加登录,问题已解决,因为您需要在此站点登录才能使用 createview
我目前正在为 createview 编写测试,但我无法向其 post 数据。
被测对象有以下型号
class Role(models.Model):
name = models.CharField(max_length=255)
linked_tenant = models.ForeignKey(Tenant, blank=True, null=True)
并在以下(通用)视图中使用
class RolCreate(TenantRootedMixin, CreateView):
model = RolTemplate
form_class = RoleForm
def get_form_kwargs(self):
kwargs = super(RolCreate, self).get_form_kwargs()
kwargs['linked_tenant'] = self.request.tenant
return kwargs
def form_valid(self, form):
form.instance.linked_tenant = self.kwargs.get('tenant')
return super(RolCreate, self).form_valid(form)
def get_success_url(self, **kwargs):
return reverse('rol_list', args=[self.request.tenant.slug])
这是我正在使用的测试。
class RolCreate_tests(TestCase):
def setUp(self):
self.tenant = get_tenant()
self.role = get_role(self.tenant)
self.client = Client(HTTP_HOST='tc.tc:8000')
self.user = get_user(self.tenant)
def test_create(self):
response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'})
self.assertEqual(response.status_code, 302)
test_against = Role.objects.get(name='new_object')
self.assertEqual(test_against, self.tenant)
抛出错误的断言是最后的'get'请求。
DoesNotExist: Role matching query does not exist.
因此未创建对象,但测试确实验证了 302 视图,这意味着正在创建 post。我不明白为什么这个测试没有做它应该做的。有人可以帮我吗?
=====
经过泰国人的建议,我得到了以下值:
(Pdb) print(self.client.post)
<bound method Client.post of <django.test.client.Client object at 0x10f20da50>>
Pdb) response
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/?next=/my/role/create/">
(Pdb) print(response)
Vary: Cookie
Content-Length: 0
Content-Type: text/html; charset=utf-8
Location: /accounts/login/?next=/my/role/create/
您是否打印了响应并检查了 return 可能是什么?
好主意是 运行 使用 PDB 进行测试。
def test_create(self):
response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'})
import pdb; pdb.set_trace()
self.assertEqual(response.status_code, 302)
test_against = Role.objects.get(name='new_object')
self.assertEqual(test_against, self.tenant)
在您的测试中添加 import pdb;pdb.set_trace() 然后检查 self.client.post()。
所以请粘贴回复包含的内容。