Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django unittest and mocking the requests module

I am new to Mock and am writing a unit test for this function:

# utils.py
import requests    

def some_function(user):
    payload = {'Email': user.email}
    url = 'http://api.example.com'
    response = requests.get(url, params=payload)      

    if response.status_code == 200:
       return response.json()
    else:
        return None

I am using Michael Foord's Mock library as part of my unit test and am having difficulty mocking the response.json() to return a json structure. Here is my unit test:

# tests.py
from .utils import some_function

class UtilsTestCase(unittest.TestCase):
    def test_some_function(self):
        with patch('utils.requests') as mock_requests:
            mock_requests.get.return_value.status_code = 200
            mock_requests.get.return_value.content = '{"UserId":"123456"}'
            results = some_function(self.user)
            self.assertEqual(results['UserId'], '123456')

I have tried numerous combinations of different mock settings after reading the docs with no luck. If I print the results in my unit test it always displays the following instead of the json data structure I want:

<MagicMock name=u'requests.get().json().__getitem__().__getitem__()' id='30315152'>

Thoughts on what I am doing wrong?

like image 477
Scott Woodall Avatar asked Aug 02 '13 18:08

Scott Woodall


1 Answers

Patch json method instead of content. (content is not used in some_function)

Try following code.

import unittest

from mock import Mock, patch

import utils

class UtilsTestCase(unittest.TestCase):
    def test_some_function(self):
        user = self.user = Mock()
        user.email = '[email protected]'
        with patch('utils.requests') as mock_requests:
            mock_requests.get.return_value = mock_response = Mock()
            mock_response.status_code = 200
            mock_response.json.return_value = {"UserId":"123456"}
            results = utils.some_function(self.user)
            self.assertEqual(results['UserId'], '123456')
like image 76
falsetru Avatar answered Oct 07 '22 16:10

falsetru