Search code examples
pythondjangounit-testingdjango-viewsdjango-testing

how to write get and post test methods for views in django?


I'm new to Django's testing and trying to write test functions for views, but I don't get the whole test view thing, I've seen a lot of examples but it seems to be to difficult, I need an example on something I wrote to get the idea. here's a function I want to test its post and get:

    def ForgetPasswordRegistry(self, request):
    forgetpassword = True
    if request.method == 'GET':
        if 'UserID' in request.session:
            forgetpassword = False
        return request, forgetpassword
    elif request.method == 'POST':
        email = request.POST['email']
        if self.IsUserExist(email):
            forget = models.ForgetPasswordRegistry()
            forget.UserID = self.GetUser(email)
            forget.Access = 1
            session = random.randint(999999999999999, 9999999999999999999999999999999999)
            forget.Session = str(session)
            link = 'http://127.0.0.1:8000/home/resetpassword/' + forget.Session
            self.SendEmail('Reset-Password', link, [forget.UserID.Email])
            forget.save()
            FeedBack = ' Check Your Mail You Got A Recovery Mail'
            AlertType = 'alert-success'
            return request, AlertType, None, FeedBack, None, None
        else:
            AlertType = 'alert-danger'
            ModalFeedBack = 'This Email Dose Not Exist'
            EmailErrors = 'This Email Dose Not Exist'
            return request, AlertType, forgetpassword, None, EmailErrors, ModalFeedBack

Solution

  • Don't let the concept of views confuse you!! Essentially there is a python function that you need to exercise certain conditionals of.

    It looks like there are 4 main branches:

    • GET not in session
    • GET in session
    • POST exists
    • POST does not exist

    so there should probably be at least 4 different tests. I'll post the first one because it is pretty straightforward:

    def ForgetPasswordRegistry(self, request):
    forgetpassword = True
    if request.method == 'GET':
        if 'UserID' in request.session:
            forgetpassword = False
        return request, forgetpassword
    
    def test_forget_get_user_id_in_session(self):
        request = Mock(session={'UserID': 'here'}, method='GET')
        # instantiate your view class
        yourview = YourView()
        sefl.assertEqual(yourview.ForgetPasswordRegistry(request), (request, False))
    

    The post user exists branch is a little more complicated because there are more things that the test needs to account for, and potentially provide stub implementations for:

    • SendEmail
    • GetUser
    • models.ForgetPasswordRegistry()