首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pytest在函数中引发模拟异常

使用Pytest在函数中引发模拟异常
EN

Stack Overflow用户
提问于 2018-06-21 09:15:33
回答 1查看 37.5K关注 0票数 23

我有以下函数,它是一个泛型函数,它将根据输入主机名和数据进行API调用。它将构造生成API的http请求并返回响应。此函数将引发四种类型的异常(无效URL、超时、auth错误和状态检查)。如何使用pytest Mcok和测试API调用中引发的异常?哪种方法是测试API调用引发的异常的最佳方法?

代码语言:javascript
复制
import ssl
import urllib
import urllib.request
import urllib.error
import xml
import xml.etree.ElementTree as ET

def call_api(hostname, data):
    '''Function to make API call
    '''
    # Todo:
    # Context to separate function?
    # check response for status codes and return reponse.read() if success
    #   Else throw exception and catch it in calling function
    error_codes = {
         "1": "Unknown command",
         "6": "Bad Xpath",
         "7": "Object not present",
         "8": "Object not unique"
     }
    url = "http://" + hostname + "/api"
    encoded_data = urllib.parse.urlencode(data).encode('utf-8')
    try:
        response = urllib.request.urlopen(url, data=encoded_data, 
timeout=10).read()
        root = ET.fromstring(response)
        if root.attrib.get('status') != "success":
            Errorcode = root.attrib.get('code')
            raise Exception(pan_error_codes.get(Errorcode, "UnknownError"), 
response)
        else:
            return response
    except urllib.error.HTTPError as e:
        raise Exception(f"HttpError: {e.code} {e.reason} at {e.url}", None)
    except urllib.error.URLError as e:
       raise Exception(f"Urlerror: {e.reason}", None)

如果我调用这个函数

代码语言:javascript
复制
def create_key(hostname, username, password):
hostname = 'myhost ip'
data = {
    'type': 'keygen',
    'username': username,
    'password': password
}
username = 'myuser'
password = 'password'
response = call_api(hostname, data)
return response

我会得到如下的回复

代码语言:javascript
复制
b"<response status = 'success'><result><key>mykey</key></result></response>"
EN

回答 1

Stack Overflow用户

发布于 2018-06-22 14:21:28

您可以通过side_effect参数模拟错误引发:

或者,side_effect可以是一个异常类或实例。在这种情况下,将在调用模拟时引发异常。

在您的示例中,可以这样使用(假设call_api是在模块foo中定义的):

代码语言:javascript
复制
import pytest
from unittest.mock import patch

def test_api():
    with patch('foo.call_api', side_effect=Exception('mocked error')):
        with pytest.raises(Exception) as excinfo:
            create_key('localhost:8080', 'spam', 'eggs')
        assert excinfo.value.message == 'mocked error' 
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50964786

复制
相关文章

相似问题

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