2010-02-24 18 views
5

Próbuję przetestować, że model UserProfile jest tworzony jako nowy użytkownik jest zarejestrowany w django_authopenid. Nie rozumiem, jak dodać dane sesji Openid do POST.W jaki sposób dodajesz dane sesji OpenId do testowego klienta POST Django?

class UserTestCAse(TestCase): 
    def test_register_should_create_UserProfile(self): 
    from django.test.client import Client 
    c = Client() 
    response = c.post('/account/register/', {u'username': [u'john'], u'email': [u'[email protected]'], u'bnewaccount': [u'Signup']},) 

    self.assertEqual(response.status_code, 302) 

    user = User.objects.get(username ='john') 
    self.assertTrue(user.get_profile()) 

Odpowiedz

2

Widocznie, dodając dane sesji do django.test.client.Client bez użycia Client.login() nie jest tak łatwo.

Najprostszym rozwiązaniem było utworzenie nowej klasy RequestFactory, aby utworzyć żądanie z obiektem sesji OpenID.

class RequestFactory(Client): 
    """ 
    Class that lets you create mock Request objects for use in testing. 

    Usage: 

    rf = RequestFactory() 
    get_request = rf.get('/hello/') 
    post_request = rf.post('/submit/', {'foo': 'bar'}) 

    This class re-uses the django.test.client.Client interface, docs here: 
    http://www.djangoproject.com/documentation/testing/#the-test-client 

    Once you have a request object you can pass it to any view function, 
    just as if that view had been hooked up using a URLconf. 

    """ 
    def request(self, **request): 
     """ 
     Similar to parent class, but returns the request object as soon as it 
     has created it. 
     """ 
     environ = { 
      'HTTP_COOKIE': self.cookies, 
      'PATH_INFO': '/', 
      'QUERY_STRING': '', 
      'REQUEST_METHOD': 'GET', 
      'SCRIPT_NAME': '', 
      'SERVER_NAME': 'testserver', 
      'SERVER_PORT': 80, 
      'SERVER_PROTOCOL': 'HTTP/1.1', 
     } 
     environ.update(self.defaults) 
     environ.update(request) 
     request = WSGIRequest(environ) 
     handler = BaseHandler() 
     handler.load_middleware() 
     for middleware_method in handler._request_middleware: 
      if middleware_method(request): 
       raise Exception("Couldn't create request mock object - " 
           "request middleware returned a response") 
     return request 

I używana RequestFactory sposób jak poniżej:

class UserProfileCreation(TestCase): 
    def test_register_should_create_UserProfile(self): 
     count = User.objects.count() 
     print 'Original Users' + str(count) 

     from forum.tests.request_factory import RequestFactory 
     rf = RequestFactory() 
     post_request = rf.post('/register/', {u'username': [u'john'], u'email': [u'[email protected]'], u'bnewaccount': [u'Signup'] }) 

     from django_authopenid.util import OpenID 
     openid_instance = OpenID('https://www.google.com/accounts/o8/id?id=AItOxxxxxxxxxxxxxxxxxA', 
           1267727884, 
           [u'openid.op_endpoint', u'openid.claimed_id', u'openid.identity', u'openid.return_to', u'openid.response_nonce', u'openid.assoc_handle'], 
           ) 

     post_request.session['openid'] = openid_instance 

     from django_authopenid.views import register 
     response = register(post_request) 

     print "after POST User count: " + str(User.objects.count()) 
     self.assertEqual(response.status_code, 302) 
     user = User.objects.get(username ='john') 
     self.assertTrue(user.get_profile()) 
Powiązane problemy