我試圖嘲笑我的要求。得到一個副作用。我想為每個副作用值關聯一個不同的 status_code,但到目前為止我還沒有成功。
def test_func1(mocker):
side_effect = ["Ok",'','','Failed']
# This line should be changed
fake_resp.status_code = 200
fake_resp = mocker.Mock()
fake_resp.json = mocker.Mock(side_effect=side_effect)
mocker.patch("app.main.requests.get", return_value=fake_resp)
# The func1 is executing multiple API calls using requests.get() and status_code is needed
a = func1(a, b)
assert a == "something"
我無法找到一種方法(在檔案和 SO 中)為每個模擬請求關聯 status_code。
我正在考慮這樣的事情,但它顯然不起作用:
def test_func1(mocker):
side_effect = [(status_code=200, return="Ok"),
(status_code=204, return=""),
(status_code=204, return=""),
(status_code=500, return="Failed")]
....
編輯:添加 func1 代碼
from datetime import datetime, timedelta
import requests
def func1(days, delta_1):
"""
days: number of days before first search (80, 25, 3)
delta_1: number of days for the date range search (40, 20, 15)
"""
now = datetime.now()
start_date = now timedelta(days=days)
# Var to stop loop when price is found
loop_stop = 0
# Var to stop loop when search date is more than a year later
delta_time = 0
price = 0
departureDate = "n/a"
# For loop to check prices till one year.
while loop_stop == 0 and delta_time < (365 - days):
date_range = (
(start_date timedelta(days=delta_time)).strftime("%Y%m%d")
"-"
(start_date timedelta(days=delta_time (delta_1 / 2))).strftime(
"%Y%m%d"
)
)
# Needs to be mocked
response = requests.get("fake_url_using_date_range_var")
if response.status_code == 204:
print("No data found on this data range")
delta_time = delta_1
elif response.status_code == 200:
price = response.json()["XXX"][0]
departureDate = response.json()["YYY"][0]
loop_stop = 1
else:
raise NameError(
response.status_code,
"Error occured while querying API",
response.json(),
)
return price, departureDate
uj5u.com熱心網友回復:
模塊的可能解決方案unittest(不是pytest)
我在添加實際函式之前已經寫了這個答案func1(),所以我創建了一個名為的檔案my_file_01.py,其中包含我的生產函式 func1():
import requests
def func1():
response1 = 'empty1'
response2 = 'empty2'
r = requests.get('http://www.someurl.com')
if r.status_code == 200:
response1 = r.json()
r = requests.get('http://www.some_other_url.com')
if r.status_code == 500:
response2 = r.error_message
return [response1, response2]
如您所見,兩次func1()呼叫并檢查回應的狀態代碼。requests.get()
我已將測驗代碼插入到具有以下內容的不同檔案中:
import unittest
from unittest import mock
from my_file_01 import func1
def request_resp1(url):
response_mock = mock.Mock()
response_mock.status_code = 200
response_mock.json.return_value = {'key1': 'value1'}
return response_mock
def request_resp2(url):
response_mock = mock.Mock()
response_mock.status_code = 500
response_mock.error_message = "Failed"
return response_mock
class TestFunc1(unittest.TestCase):
@mock.patch("my_file_01.requests")
def test_func1(self, mock_requests):
print("test func1()")
mock_requests.get.side_effect = [request_resp1(""), request_resp2("")]
[response1, response2] = func1()
print("response1 = " str(response1))
print("response2 = " str(response2))
if __name__ == "__main__":
unittest.main()
測驗檔案定義了TestFunc1包含測驗方法的測驗類test_func1()。
此外,在檔案中定義了 2 個稱為request_resp1()和的函式request_resp2()。這些函式用于定義不同的回應值,以便第一次呼叫requests.get()成功,而第二次呼叫requests.get()失敗。
如果您嘗試執行測驗代碼,您會看到func1()回應的 2 個不同狀態代碼回傳不同的值。
uj5u.com熱心網友回復:
基于@frankfalse 的解決方案,可以將兩個模擬函式替換為一個類。
class MockResponse:
def __init__(self, json_data, status_code=requests.codes.ok):
self.json_data = json_data
self.status_code = status_code
def json(self):
return self.json_data
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/528203.html
