2017-12-17 21 views
0

イベントモデルオブジェクトを作成するビューのテストを作成しようとしています。イベントモデルには、モデルオブジェクトの作成者としてauth userを参照するforeignKeyフィールドが含まれています。テストでは、ログインしているユーザーにrequest.userを設定すると仮定したユーザーにログインしようとしました。テストされているビューは、通常、ajaxによって正常に起動されたときに、テスト私は以下のエラーを取得し続けます。また、 "class.setupTestData()"で作成されたユーザーを参照する代わりに、テスト関数内でユーザーを作成しようとしましたが、同じエラーが発生します。djangoテストでは、foreignKeyフィールドに "event.creator"を渡す必要があります。

エラー

ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x108ae9cc0>>": "Event.creator" must be a "User" instance. 

モデル

class Event(models.Model): 
     name = models.CharField(max_length=200) 
     event_type = models.CharField(max_length=200, null=True) 
     creator = models.ForeignKey(User, on_delete=models.CASCADE, null=True) 
     attendees = models.ManyToManyField(User, related_name='attendees') 
     start_date = models.DateField(null=True) 
     start_time = models.TimeField(null=True) 
     end_date = models.DateField(null=True) 
     end_time = models.TimeField(null=True) 
     location = models.CharField(max_length=200, null=True) 
     date_created = models.DateTimeField(auto_now_add=True) 
     description = models.TextField() 

     def __str__(self): 
      return self.name 

def createEvent(request): 
     # dec vars 
     event_title = str(request.POST['event-title']).title() 
     event_type = str(request.POST['event-type']) 
     event_location = str(request.POST['event-location']) 
     event_description = str(request.POST['event-description']) 
     event_start_date = str(request.POST['event-start-date']) 
     event_start_time = str(request.POST['event-start-time']) 
     event_end_date = str(request.POST['event-end-date']) 
     event_end_time = str(request.POST['event-end-time']) 
     creator = request.user 

     # create event 
     Event.objects.create(
      name=event_title, 
      event_type=event_type, 
      creator=creator, 
      location=event_location, 
      description=event_description, 
      start_date=event_start_date, 
      start_time=event_start_time, 
      end_date=event_end_date, 
      end_time=event_end_time 
     ) 

     # #create response 
     response = { 
      'status': 'success', 
     } 

     # send reponse JSON 
     return JsonResponse(response) 

試験

def test_create_event(self): 
    today = timezone.now() 
    user = User.objects.get(pk=1) 

    # login user 
    self.c.login(username=user.username, password=user.password) 

    # Check event create 
    response = self.c.post('/event/create/', { 
     'event-title': 'test create event', 
     'event-type': 'combat', 
     'event-location': 'ltt 9455', 
     'event-description': lorem.paragraph, 
     'event-start-date': today.date(), 
     'event-end-date': today.date(), 
     'event-end-time': today.time(), 
     'event-start-time': today.time() 
    }) 

    self.assertTrue() 
+0

私はDjangoのRequestFactoryを使用してこれに対する解決策を見つけたと思います。 – doughboy

答えて

1

user.passwordはあなたがlogin

user = User.objects.get(pk=1) 
self.client.login(username=user.username, password='actual_password') 

それともしない、代わりにclient.force_login()を使用することができます呼び出すときは、実際のパスワードを使用することができclient.login()

を呼び出すときので、あなたがそれを使用することはできません、パスワードをハッシュ化されていますパスワードが必要です。

user = User.objects.get(pk=1) 
self.client.force_login(user) 

あなたの失敗したテストでは、あなたのビューに問題が明らかになったことに注意してください。匿名ユーザーがそのビューを使用する場合、ValueErrorは500サーバーエラーを引き起こします。最も簡単な修正は、login_requiredデコレータを使用することです。

from django.contrib.auth.decorators import login_required 

@login_required 
def createEvent(request): 
    ... 
+0

ありがとう、強制ログインが機能しました。テンプレートでは、 '{%if user.is_authenticated%}'タグを使用してボタンを隠し、ログインしていないユーザーがイベントを作成しないようにしました。ログインしたユーザを必要とするビューやそれが過度であるビューでは、テンプレートタグとともに '@ login_required'デコレータを使用する必要があります。 – doughboy

+0

私はビューをチェックし、テンプレートに依存しません。テンプレート内のボタンを隠すのは良いですが、ユーザーが手動でリクエストを送信するのを止めることはありません。 – Alasdair

+0

アドバイスをいただき、ありがとうございました。私は先に進み、デコレータを追加しました。デコレータとテンプレートタグの両方を使用するつもりです。 – doughboy

関連する問題