多次更改 monkeypatch setattr
Changing monkeypatch setattr multiple times
我正在尝试测试依赖于第三方的代码,并且想使用 monkeypatch 来复制我期望请求会 return 的内容。这是我拥有的代码的最小示例。
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.setattr
对每个对 requests.get
的调用进行 monkeypatch? mock包好像可以do this using side effects。我如何使用 pytest 执行此操作?
当您使用 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 来复制我期望请求会 return 的内容。这是我拥有的代码的最小示例。
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.setattr
对每个对 requests.get
的调用进行 monkeypatch? mock包好像可以do this using side effects。我如何使用 pytest 执行此操作?
当您使用 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"]