質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2141閲覧

Django self.client.post(...)でDB登録を試みたが、登録が確認できない

Madai

総合スコア29

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/22 08:19

編集2021/05/22 08:41

ユニットテストとして、self.client.postメソッドを利用して、DBへの登録を行っておりますが、
登録の確認ができませんでした。
下記に確認したことを列挙しますが、これ以上の検証が個人では難しく、ご教示をお願いしたく存じます。

【確認したこと】

  • ブラウザから同じ内容(CSRFトークンを除く)のリクエストを送った場合には正常に登録が確認できる
  • JSONにCSRFトークンが含まれていないことによるエラーではない模様

 →戻ってきたステータスが403エラーではなく302であったため、CSRFトークンが含まれないことによるエラーではないことを確認
→念の為に@csrf_exemptでCSRF対策を除いて検証したが、結果は変わらず

  • JSONの形式が不正でないかを確認

 →ツールで確認して問題ないことを確認

  • POST通信先のアドレスが不正でないことを確認

 →ブラウザのデベロッパーツールで登録時のアドレスと相違ないことを確認

from django.contrib.auth import get_user_model from django.test import TestCase from django.urls import reverse_lazy from django.views.decorators.csrf import csrf_exempt from ..models import Clients # loginを前提とする処理用のテストクラス class LoggedInTestCase(TestCase): def setUp(self): self.test_user = get_user_model().objects.create_user( username='test_user', email='test@test.com', password='password') self.client.login(email=self.test_user.email, password=self.test_user.password) class Test_ClientRegistrationView(LoggedInTestCase):   @csrf_exempt def test_create_client_success(self): params = { "name": "顧客名", "name_kana": "フリガナ", "department": "部署", "industry":"", "capital":"", "postcode":"", "address":"", "phone_number":"", "email":"", "fax_number":"", "revenue":"", "profit":"", "number_of_employees":"", "remark":"" } response = self.client.post(reverse_lazy('client:registration'), params) # DBへの登録を検証 self.assertEqual(Clients.objects.filter(name='顧客名').count(), 1)

【エラーメッセージ】
DBへの登録を検証の箇所にて
AssertionError: 0 != 1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/22 20:47 編集

通常時のpostとunitテスト時のpostのresponseを確認して差分はありませんか?後続処理を進めないようにして、適宜print(), exit()で値を確認し、どこまで互いに正常に進んでいるのかご確認いただけますか?????‍♂️
Madai

2021/05/23 05:52

ご助言を頂いたprintデバックで問題箇所の特定にいたれました。 問題の特定方法をご教示いただけましたこと、誠にありがとうございました。
退会済みユーザー

退会済みユーザー

2021/05/23 06:16

お、ナイス問題解決です。 うまくいって本当によかった!! また困ったこととかありましたら、気軽にご相談ください〜!!
Madai

2021/05/23 14:39

ありがとうございます! 未熟な私にとって、解決の手助けを頂けることはとても有難いことです。
guest

回答2

0

記載されているコードを素直に読むと、「登録している際の名前」と「テスト時に探している名前」が違っているように見えます。

  • 登録時: name = 名前
  • 検証時: name = 顧客名

ここを揃える必要がありませんか。

投稿2021/05/22 08:23

attakei

総合スコア2740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Madai

2021/05/22 08:27

すみません 貼り付けていたソースに誤りがございました。 登録時と検証時の値は同一になります。 当該ソースを修正しておきます。
attakei

2021/05/22 16:49

質問文に、該当viewsも記載してもらったほうがいいかもしれないです。 > JSONの形式が不正でないかを確認 ここの文を改めて見てちょっとだけ引っかかったのですが、テストクライアントのpostは第2引数のdataに渡されたdictデータをForm形式でviewに渡すので、もしかしたらviewsの実装と送信形式が違っている可能性もあるかなと思いました。
Madai

2021/05/23 05:56

ご協力いただき、ありがとうございました。 今回はユニットテストのソースコードだけの問題でしたが、次回からはViewのソースも記載するようにいたします。  JSONではなく、dictですよね... スタイルが同じなので、なぜか勘違いしていました お恥ずかしい
guest

0

自己解決

Test_ClientRegistrationViewクラスは問題がなく、
LoggedInTestCaseクラスでログインが失敗しておりました。

class LoggedInTestCase(TestCase): def setUp(self):      self.password = 'password' self.test_user = get_user_model().objects.create_user( username='test_user', email='test@test.com', password=self.password) self.client.login(email=self.test_user.email, password=self.password)

create_user関数でpassword変数に'password'を格納していますが、
この段階でpasswordの文字列が暗号化されて格納しており、復号化されているパスワードを求められているログイン関数に暗号化されたpasswordを入力していることが問題でした。
したがって、passwordの変数を外で定義することで問題が回避できます。

投稿2021/05/23 05:48

Madai

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問