Django unittest和mocking请求模块

Sco*_*all 8 python unit-testing mocking python-requests

我是Mock的新手,我正在为这个函数编写一个单元测试:

# 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
Run Code Online (Sandbox Code Playgroud)

我使用Michael Foord的Mock库作为我的单元测试的一部分,并且很难嘲笑response.json()返回json结构.这是我的单元测试:

# 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')
Run Code Online (Sandbox Code Playgroud)

在没有运气阅读文档后,我尝试了不同模拟设置的多种组合.如果我results在单元测试中打印它总是显示以下内容而不是我想要的json数据结构:

<MagicMock name=u'requests.get().json().__getitem__().__getitem__()' id='30315152'>
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么的想法?

fal*_*tru 15

补丁json方法代替content.(content不用于some_function)

请尝试以下代码.

import unittest

from mock import Mock, patch

import utils

class UtilsTestCase(unittest.TestCase):
    def test_some_function(self):
        user = self.user = Mock()
        user.email = 'user@example.com'
        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')
Run Code Online (Sandbox Code Playgroud)