python-3.x 如何模拟在调用函数逻辑所需的参数上进行突变的函数

vi4fp9gy  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(118)

我希望能够模拟一个改变参数的函数,并且它的改变是相关的,以便代码继续正确执行。
请考虑以下代码:

def mutate_my_dict(mutable_dict):
    if os.path.exists("a.txt"):
        mutable_dict["new_key"] = "new_value"
        return True

def function_under_test():
    my_dict = {"key": "value"}
    if mutate_my_dict(my_dict):
        return my_dict["new_key"]
    return "No Key"

def test_function_under_test():
    with patch("stack_over_flow.mutate_my_dict") as mutate_my_dict_mock:
        mutate_my_dict_mock.return_value = True
        result = function_under_test()
    assert result == "new_value"

请理解,我知道在这种情况下我可以模拟os.path.exists,但这只是一个示例。我有意模拟函数,而不是外部模块。

我也读了这里的文档:但它似乎不适合我的情况。
这是我到目前为止编写的测试,但它显然不起作用,因为密钥发生了变化:

def test_function_under_test():
    with patch("stack_over_flow.mutate_my_dict") as mutate_my_dict_mock:
        mutate_my_dict_mock.return_value = True
        result = function_under_test()
    assert result == "new_value"

提前感谢您的所有时间:)

bnl4lu3b

bnl4lu3b1#

在彼得的帮助下,我想出了最后一个测试:

def mock_mutate_my_dict(my_dict):
    my_dict["new_key"] = "new_value"
    return True

def test_function_under_test():
    with patch("stack_over_flow.mutate_my_dict") as mutate_my_dict_mock:
        mutate_my_dict_mock.side_effect = mock_mutate_my_dict
        result = function_under_test()
    assert result == "new_value"

它的工作原理是,你可以运行一个函数而不是原来的函数,在这个函数中,你需要改变所有的参数,并返回返回的值。

相关问题