2016-04-08 3 views
0

Im in meinem Django-Projekt einig Unit-Tests zu tun, und sind immer Fehler
"AttributeError: 'SignUp' object has no attribute 'email'" wenn ich diesen Test ausführen.Attribute: ‚AcceptInvite‘ Objekt hat kein Attribut ‚E-Mail‘

def test_signup(self): 
     response = self.c.post('/accounts/signup/', {'email': '[email protected]', 'password': 'test123', 'password_conf': 'test123', 
                'org_name': 'test org', 'org_username': 'test org username', 'invite': '4013'}) 
     code = response.status_code 
     self.assertTrue(code == 200) 

Die Aussicht dies einfach testen, nimmt ein Anmeldeformular, und erstellt ein neues Konto mit ihm.

def signup(request): 
    # """Register a new account with a new org.""" 

    if request.method == "POST": 
     form = SignUp(request.POST) 

     if not form.email or not form.password: 
      raise Exception("Email and Password are required") 
     if form.password != form.password_conf: 
      raise Exception("Password does not match confirmation") 
     if not form.org_name or not form.org_username: 
      raise Exception('Organization name and username are required') 
     if not form.invite: 
      raise Exception('Invitation code is required') 

     if form.is_valid(): 
      cleaned_data = form.cleaned_data 

      email = cleaned_data['email'] 
      password = cleaned_data['password'] 
      org_name = cleaned_data['org_name'] 
      org_username = cleaned_data['org_username'] 
      invite_token = cleaned_data['invite'] 

      invitation = OrgInvite.objects.get(token=invite_token) 

      if invitation.used: 
       raise Exception("invitation code is invalid") 

      account = Account(email=email, password=password) 
      account.save() 

      org = Org(org_name=org_name, org_username=org_username) 
      org.save() 

      invitation.used = False 
      invitation.save() 

      login(request) 

      # Send Email 

      md = mandrill.Mandrill(settings.MANDRILL_API_KEY) 
      t = invite_token.replace(' ', '+') 
      url = "https://www.humanlink.co/verify/{}".format(t) 
      message = { 
       'global_merge_vars': [ 
        {'name': 'VERIFICATION_URL', 'content': url}, 
       ], 
       'to': [ 
        {'email': account.email}, 
       ], 
      } 
      message['from_name'] = message.get('from_name',  'Humanlink') 
      message['from_email'] = message.get('from_email', '[email protected]') 
      try: 
       md.messages.send_template(
        template_name='humanlink-welcome', message=message, 
        template_content=[], async=True) 
      except mandrill.Error as e: 
       logging.exception(e) 
       raise Exception('Unknown service exception') 

Das Anmeldeformular hat ein E-Mail-Feld, und die Daten in request.POST sollten die E-Mail ich es sende haben mit post-Methode meines Klienten in meinem Unit-Test verwendet wird, so dass ich bin wirklich nicht sicher, warum es hätte immer noch kein "E-Mail" -Attribut.

Form:

class SignUp(forms.Form): 
    email = forms.EmailField() 
    password = forms.CharField() 
    password_conf = forms.CharField() 
    org_name = forms.CharField() 
    org_username = forms.CharField() 
    invite = forms.CharField() 

Antwort

2

Sie Code leidet an mehrere Fehler. Um Ihre Frage zu adressieren, haben Sie in Ihrer Ansichtsmethode signup ein Formular erstellt, aber Sie sollten nicht form.email oder form.password tun, da dies nicht der Fall ist, wenn django Formulardaten verarbeitet.

Andere verwandte Probleme, zuerst müssen Sie form.is_valid() aufrufen, bevor Sie irgendwelche Daten von Formularobjekt erhalten konnten. Trotzdem sollten Sie form.cleaned_data['email'] verwenden, um auf die Formulardaten zuzugreifen.

Zweitens. Sie sollten keinen leeren Check so machen. Wenn Sie setzen:

email = forms.EmailField(required=True) 

django wird automatisch die Leere für Sie bereits überprüfen.

Drittens wird durch das Auslösen der Ausnahme in der Methode "views.py" das Formular nicht dazu gebracht, die Nachricht an die gewünschte Vorlage zurückzugeben. Wenn Sie über eine benutzerdefinierte Formularvalidierung verfügen, sollten Sie dies in der clean-Methode der Formularklasse tun.

Bitte überprüfen Sie Django Doc über how to use form properly.

+0

Ihre Lösung behebt das Problem. Danke Shang. – JBT