多次更改monkeypatch setattr

Jac*_*ody 4 python monkeypatching mocking pytest

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

import requests

def get_urls(*urls):
    results = []
    for url in urls:
        results.append(requests.get(url).text)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

如何对每个 using 调用进行猴子requests.get补丁monkeypatch.setattr?模拟包似乎能够使用副作用来做到这一点。我如何使用 pytest 做到这一点?

jor*_*anm 7

当您使用 覆盖方法调用时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"]
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案很好,但我想知道是否允许在测试中多次使用monkeypatch.setattr (2认同)