试图测试一个函数,但在测试中 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"