试图测试一个函数,但在测试中 returns None?
Trying to test a function but in test it returns None?
我有这个功能想测试一下,这就是它的样子。
def myfunction():
response = requests.post(url,params=params,headers=headers,data=data)
response = response.json()
return response["Findme"].lower()
我的测试脚本:
@mock.patch('requests.post',return_value="{'Findme': 'test'}")
def test_myfunction(mocked_post):
**assert myfunction() == "test"**
当我 运行 测试时,我的函数 () 一直得到 None,但是当我删除 response.json() 时它有效吗?
谁能帮帮我。
如 Deep Space 所述,您的 returned 对象没有 json
方法,因为它属于 str
类型。如果你想拥有与被测函数相同的行为,你必须提供一个具有该方法的对象:
class MockResponse:
"""Mocks relevant part of requests.Response"""
def __init__(self, s):
self.json_string = s
def json(self):
return json.loads(self.json_string)
@mock.patch("requests.post", return_value=MockResponse('{"Findme": "test"}'))
def test_myfunction(mocked_post):
assert myfunction() == "test"
这样,MockResponse
类型的对象是从模拟的 post
函数中 return 得到的,可以使用 json()
.
反序列化
如果您想这样做,您也可以直接模拟 json
的 return 值,而不是模拟 post
的 return 值。在这种情况下,您不需要额外的 class:
@mock.patch("requests.post")
def test_myfunction(mocked_post):
mocked_post.return_value.json.return_value = {"Findme": "test"}
assert myfunction() == "test"
我有这个功能想测试一下,这就是它的样子。
def myfunction():
response = requests.post(url,params=params,headers=headers,data=data)
response = response.json()
return response["Findme"].lower()
我的测试脚本:
@mock.patch('requests.post',return_value="{'Findme': 'test'}")
def test_myfunction(mocked_post):
**assert myfunction() == "test"**
当我 运行 测试时,我的函数 () 一直得到 None,但是当我删除 response.json() 时它有效吗?
谁能帮帮我。
如 Deep Space 所述,您的 returned 对象没有 json
方法,因为它属于 str
类型。如果你想拥有与被测函数相同的行为,你必须提供一个具有该方法的对象:
class MockResponse:
"""Mocks relevant part of requests.Response"""
def __init__(self, s):
self.json_string = s
def json(self):
return json.loads(self.json_string)
@mock.patch("requests.post", return_value=MockResponse('{"Findme": "test"}'))
def test_myfunction(mocked_post):
assert myfunction() == "test"
这样,MockResponse
类型的对象是从模拟的 post
函数中 return 得到的,可以使用 json()
.
如果您想这样做,您也可以直接模拟 json
的 return 值,而不是模拟 post
的 return 值。在这种情况下,您不需要额外的 class:
@mock.patch("requests.post")
def test_myfunction(mocked_post):
mocked_post.return_value.json.return_value = {"Findme": "test"}
assert myfunction() == "test"