2017-09-01 42 views
0

的问题已经解决了由于Thaian,通过添加登录到“test_create”功能的开始,因为你需要先登录本网站使用CreateView的Django的测试客户端发布数据

我目前正在为createview编写一个测试,我无法发布数据。

的被测试对象具有以下模型

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视图,这意味着正在创建一个帖子。我不明白为什么这个测试没有做到它应该做的。这里有人能帮助我吗?

=====

Thaians建议后,我得到了以下值:

(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/ 

回答

2

是否打印响应,并检查什么,也许回报?

好主意是用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()。

所以请贴上包含什么回应。

+0

感谢您的留言,PDB提供了以下变量输出: 响应: 有所不同:饼干 的Content-Length:0 的Content-Type:text/html的; charset = utf-8 位置:/ accounts/login /?next =/my/role/create/ client:<绑定方法Client.post ><绑定方法Client.post的> – Jasper

+0

@Jasper在test_create的第一行添加强制授权,例如:'self.client.force_login(self.user)'也许这可以解决您的问题如果只有经过身份验证的用户才能创建新角色。 [django force_login](https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.Client.force_login) – Thaian

+0

这解决了我的问题! 我完全忘了为用户添加一个登录。 (由于我添加了所有其他功能,导致更糟糕的是,doh) 非常感谢您的帮助! – Jasper