2017-09-01 4 views
0

あなたはCREATEVIEWDjangoのテストクライアントポストデータ

を使用するには、このサイトにログインする必要があるような問題は、「test_create」関数の先頭にログインを追加することにより、Thaianのおかげで解決されています

現在、私は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) 

add import pdb; pdb.set_trace()をテストし、次にself.client.post()をチェックします。

回答に含まれる内容を貼り付けてください。

+0

PDBは、次の変数の出力を与え、あなたのメッセージをありがとう: 応答: はヴァリ:クッキー のContent-Length:0 のContent-Type:text/htmlの。クライアントの<バインド方法><バインド方法<クライアントのポスト>バインドされたメソッド 0x10f20da50 >> – 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

これは私の問題を解決しました! ユーザーのログインを完全に忘れてしまいました。 (私が他のすべての機能にそれを加えたという事実によってさらに悪くなった間違い) あなたの助けに多くの感謝! – Jasper

関連する問題