【问题标题】:pytest monkeyPatch for an API function用于 API 函数的 pytest monkeyPatch
【发布时间】:2021-09-21 08:19:55
【问题描述】:

我正在编写一些测试,并且在使用外部 API 时我必须创建一些功能补丁。故意不是保留工程师 API 设计,而是创建一个补丁以在测试期间施加类似的行为。

例如 考虑 'requests' API,我们可以通过调用 requests.get('https:// URL') 来获取任何 URL 的响应。猴子补丁documentation 中提供了此功能的补丁。

现在考虑一个不同的 API。哪个更复杂并且具有嵌套功能。现在问题变成了我们如何准确地为嵌套函数创建补丁。

代码示例

SomeAPIClass.function_1().function_2().execute()

现在的问题是,我究竟如何为execute() 函数创建补丁。 MonkeyPatch 确实为给定函数设置了一个属性,但这只是转到function_1(),因为它会变成monkeypatch.setattr(SomeAPIClass, "function_1", mock_get)

【问题讨论】:

  • 我添加了一个答案。你能检查一下它是否对你有用吗?

标签: python pytest google-analytics-api monkeypatching


【解决方案1】:

我们可以通过嵌套.return_valuemock chained calls,如文档所述:

mock_backend.get_endpoint.return_value.create_call.return_value.start_call.return_value = mock_response

所以对于你的情况,应该是:

with patch('SomeAPIClass') as mock:  # Or if using pytest-mock, this could simply be <mock = mocker.patch('SomeAPIClass')>
    # To call: SomeAPIClass.function_1().function_2().execute()
    mock.function_1.return_value.function_2.return_value.execute.return_value = "Execution result!"

    # To call: SomeAPIClass().function_1().function_2().execute()
    mock.return_value.function_1.return_value.function_2.return_value.execute.return_value = "Execution result!"

样品运行

src.py

class SomeAPIClass:
    pass

test_src.py

from unittest.mock import patch

import src


# Using unittest.mock
def test_patch():
    with patch('src.SomeAPIClass') as mock:
        mock.function_1.return_value.function_2.return_value.execute.return_value = "Execution result!"
        assert src.SomeAPIClass.function_1().function_2().execute() == "Execution result!"

        mock.return_value.function_1.return_value.function_2.return_value.execute.return_value = "Execution result 2!"
        assert src.SomeAPIClass().function_1().function_2().execute() == "Execution result 2!"


# Using pytest-mock's mocker
def test_patch_2(mocker):
    mock = mocker.patch('src.SomeAPIClass')

    mock.function_1.return_value.function_2.return_value.execute.return_value = "Execution result!"
    assert src.SomeAPIClass.function_1().function_2().execute() == "Execution result!"

    mock.return_value.function_1.return_value.function_2.return_value.execute.return_value = "Execution result 2!"
    assert src.SomeAPIClass().function_1().function_2().execute() == "Execution result 2!"

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多