2017-12-17 15 views
0

이벤트 모델 객체를 만드는 뷰에 대한 테스트를 작성하려고합니다. 이벤트 모델에는 auth user를 모델 객체의 작성자로 참조하는 foreignKey 필드가 있습니다. 테스트에서 나는 로그인 한 사용자에게 request.user를 설정할 것이라고 가정 한 사용자 로깅을 시도했다. 테스트중인 뷰는 정상적으로 Ajax를 통해 트리거 될 때 작동하지만 실행시 이벤트를 만들 때 request.user를 참조한다. 나는 아래 오류를 계속 시험해 본다. 또한 "class.setupTestData()", 같은 오류에서 만든 사용자를 참조하는 대신 테스트 함수 내에서 사용자 만들기 시도했다.django는 foreignKey 필드에 request.user를 전달하면 "Event.creator"가 "User"인스턴스 여야합니다.

오류

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.passwordclient.login()

를 호출 할 때, 따라서 당신은 당신이 login

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

를 호출 할 때 실제 암호를 사용할 수 있습니다 사용할 수 없거나하지 않는 대신 client.force_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 %} '태그를 사용하여 로그인하지 않은 사용자가 이벤트를 만들지 못하도록 버튼을 숨 깁니다. 로그 된 사용자를 필요로하거나 과잉 공격하는 뷰에서 template 태그와 함께'@ login_required' 데코레이터를 사용해야합니까? – doughboy

+0

보기를 확인하고 템플릿을 사용하지 않습니다. 템플릿에서 버튼을 숨기는 것이 좋지만 사용자가 수동으로 요청을 제출하는 것을 중지하지는 않습니다. – Alasdair

+0

조언을 주신 데 대해 다시 한번 감사 드리며 데코레이터를 추가했습니다. 저는 데코레이터와 템플릿 태그를 모두 사용할 것입니다. – doughboy