Python 使用Pytest模拟错误的JSON响应,故意引发simplejson.errors.JSONDecodeError

Python 使用Pytest模拟错误的JSON响应,故意引发simplejson.errors.JSONDecodeError,python,unit-testing,exception,mocking,pytest,Python,Unit Testing,Exception,Mocking,Pytest,我想用Pytest测试异常。我发送一个HTTP请求并得到一个响应。我希望响应损坏,以便response.json()转到except块。下面是一些例子 发送请求,接收响应: def send_message_json(): # ... 尝试: response=cls.send_消息(方法、url、**kwargs) 如果回答: return response.json()#这是应该失败的 除了simplejson.errors.JSONDecodeError作为错误外: 提高误差——这是要实现

我想用Pytest测试异常。我发送一个HTTP请求并得到一个响应。我希望响应损坏,以便response.json()转到except块。下面是一些例子

发送请求,接收响应:

def send_message_json():
# ...
尝试:
response=cls.send_消息(方法、url、**kwargs)
如果回答:
return response.json()#这是应该失败的
除了simplejson.errors.JSONDecodeError作为错误外:
提高误差——这是要实现的
单元测试应该断言应该引发simplejson.errors.JSONDecodeError

@mock.patch.object(服务'send\u message\u json')
def测试发送消息json异常(模拟发送):
svc=服务()
使用pytest.raises(simplejson.errors.JSONDecodeError):#这应该断言引发的异常
svc.send_message_json(“GET”http://my.url/')

我无法激活pytest.mock.object引发的异常。什么会使.json()在模拟中失败?

我通过模拟实际请求的响应来解决这个问题

  • 在原始问题中,有一个send_message_json()方法
  • 它调用send_message()方法,该方法返回requests.Response。因此,我模拟了send_message()的返回值,它也是一个模拟值,而不是send_message_json()
  • @mock.patch.object(服务“发送消息”)#改为mock发送消息
    def测试发送消息json异常(模拟发送):
    svc=服务()
    模拟_响应=响应()
    模拟_响应。状态_代码=200
    mocked_response.data='',所以这显然不是JSON
    mock_send.return_value=mock_response#在此处应用模拟响应
    使用pytest.raises(simplejson.errors.JSONDecodeError):
    svc.send_message_json(“GET”http://my.url/“)#调用send_message()并返回错误的模拟请求。响应
    
  • 错误的mocked requests.Response在send_message_json()中的mocked_Response.json()处失败,并引发simplejson.errors.JSONDecodeError

  • @mock.patch.object(服务,'send_message_json',side_effect=jsondecoderror)
    @hoefling使用这种方法,我认为无论我对函数做了什么更改,它都会抛出这个错误。例如,如果我对这个方法send_message_json()进行了不应该通过的更改,那么副作用还会抛出一个否则不会抛出的错误吗??