2017-09-01 41 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