【问题标题】:Changing monkeypatch setattr multiple times多次更改monkeypatch setattr
【发布时间】:2020-02-28 15:59:56
【问题描述】:

我正在尝试测试依赖于第三方的代码,并希望使用 monkeypatch 来复制我期望请求将返回的内容。这是我拥有的代码的最小示例。

import requests

def get_urls(*urls):
    results = []
    for url in urls:
        results.append(requests.get(url).text)

对于我的测试,我有如下内容:

from my_package import get_urls

def test_get_urls():
    urls = ("https://example.com/a", "https://example.com/b", "https://example.com/c")
    assert len(get_urls(urls)) == 3

如何使用monkeypatch.setattrrequests.get 的每个调用进行monkeypatch?模拟包似乎可以do this using side effects。如何使用 pytest 做到这一点?

【问题讨论】:

    标签: python mocking pytest monkeypatching


    【解决方案1】:

    当您使用monkeypatch 覆盖方法调用时,您可以将该属性设置为自定义函数。下面是一种基于 url 实现不同行为的方法:

    URL_MAP = {
        'https://example.com/a': json.dumps({1: 2}),
        'https://example.com/b': json.dumps({3: 4})
    }
    
    def fake_req_get(url, *args, **kwargs):
        return URL_MAP.get(url, '{}')
    
    def test_get_urls(monkeypatch):
        monkeypatch.setattr('requests.get', fake_req_get)
        urls = ("https://example.com/a", "https://example.com/b", "https://example.com/c")
        assert get_urls(urls)[0] == URL_MAP["https://example.com/a"]
    

    【讨论】:

    • 这正是我想要的。谢谢!
    • 这对我也有帮助,非常整洁,谢谢!
    • 这个解决方案很好,但我想知道是否允许在测试中多次使用monkeypatch.setattr
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-07-12
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多