首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python unittest.mock库

Python unittest.mock库
EN

Stack Overflow用户
提问于 2018-11-14 21:47:46
回答 1查看 1.6K关注 0票数 0

我正在为请求库编写单元测试。对于我的大多数库,我对响应运行一个.content.decode('utf-8')来获取实际文本。但是,当我从api调用中模拟这个响应时,如何模拟请求调用接收到的响应对象?是否有一个requests.content.encode('utf-8',data))看起来类似的进程,它实际上可以模拟来自API调用的响应(以编码格式),然后我对该对象进行解码。

样本代码:

代码语言:javascript
复制
def sample_fct(self, endpoint):
    try:
        request = requests.post (endpoint, verify=False)
    except requests.exceptions.RequestException as e:
        raise
    return request

def get_something(self,test):
    try:
        response = self.sample_fct(test)
        resp_text = response_bare.content.decode('utf-8')
        print resp_text
    except:
        raise 

因此,例如,如果我想对get_something函数进行单元测试,我需要模拟sample_fct函数。为此,我必须将sample_fct.return_value设置为它正在返回的请求对象。

那么我如何创建这个对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-16 11:44:21

就像我上面说的,你可以这样嘲笑我的反应。请注意,我采取了一些自由,使您的代码和我的测试实际工作。它们包括在评论中:

代码语言:javascript
复制
"""request_module.py"""
import requests


class SomeClass(object):
    """I put these in a class, since you had self as your first arg"""
    def sample_fct(self, endpoint):
        try:
            request = requests.post (endpoint, verify=False)
        except requests.exceptions.RequestException as e:
            raise
        return request

    def get_something(self, test):
        try:
            response = self.sample_fct(test)
            resp_text = response.content.decode('utf-8')
            # Changed to return the value instead of print it
            return resp_text
        except:
            raise 

您可以在测试中看到如何将模拟的sample_fct的返回值分配给任意Mock对象。该对象可以具有分配给它的任意属性,这可以帮助测试可能有许多属性级别的返回值。

代码语言:javascript
复制
"""test_request_module.py"""
import unittest
import unittest.mock as mock

from request_module import SomeClass

class TestRequests(unittest.TestCase):
    @mock.patch('request_module.SomeClass.sample_fct')
    def test_get_something(self, mock_sample_fct):
        mock_sample_fct.return_value = mock.Mock(content=b'some content you want to decode \xE2\x98\xBA')
        # Testing that your decoded value is returned
        some_class = SomeClass()
        result = some_class.get_something('some_test_value')
        # Note the decoded smiley face
        self.assertEqual('some content you want to decode ☺', result)

注意,您还可以在Mock上分配属性的属性。因此,如果您的调用方期望得到类似request.attributes.nested_attributes.value的内容,您可以这样做,Mock将允许这样做:

代码语言:javascript
复制
mock_ret = mock.Mock()
mock_ret.request.attributes.nested_attributes.value = 'deep attr value'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53309207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档