Смена monkeypatch setattr несколько раз - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь протестировать код, который зависит от третьей стороны, и хотел бы использовать 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 каждый из вызовов к requests.get с использованием monkeypatch.setattr? Макетный пакет, похоже, способен сделать это, используя побочные эффекты . Как мне сделать это с pytest?

1 Ответ

2 голосов
/ 28 февраля 2020

Когда вы переопределяете вызов метода с помощью 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"]
...