Мне нужно monkeypatch некоторых функций в проекте, для которого я пишу тесты, но перед этим я создал простой проект, чтобы опробовать его (в основном он использует request.get для вызова API ipify, чтобы получить мой публичный IP, и яя пытаюсь установить патч для функции request.get ИЛИ функции из моего собственного кода, который вызывает request.get, чтобы вернуть фиксированное значение - в данном случае «0.0.0.0».
Структура проектавыглядит следующим образом:
- корневой каталог
- ipify_api (мой пакет)
- method.py (здесь у меня есть функция, которая возвращает публичный IP, возвращенный API)
- helpers.py (здесь у меня есть функция, которая вызывает API и возвращает ответ)
- tests
Код проекта:
ipify_api / helpers.py
from requests import get
def request_ipify_api():
r = get("https://api.ipify.org/?format=raw")
return r
ipify_api / Methods.py
from .helpers import *
def get_public_ip() -> str:
r = request_ipify_api()
return r.text
tests / test_ipify.py
import requests
import ipify_api
# import ipify_api.helpers
class FakeResponse:
text: str
class TestIpifyAPI:
@staticmethod
def __get_fake_response():
r = FakeResponse()
r.text = "0.0.0.0"
return r
def test_get_public_ip(self, monkeypatch):
"""Calling methods.get_public_ip() should return 0.0.0.0
"""
# monkeypatch.setattr(ipify_api.helpers, "request_ipify_api", self.__get_fake_response)
monkeypatch.setattr(requests, "get", self.__get_fake_response)
assert ipify_api.get_public_ip() == "0.0.0.0"
Проблема в том, что настоящая функция продолжает вызываться, поэтому я не получаю ожидаемый результат "0.0.0.0", а вместо этого мой реальный IP (потому что вызывается реальный request.get).Исправление моей собственной функции ipify_api.helpers.request_ipify_api () дает тот же результат.
Насколько я понимаю, я делаю то, что заявляет документация pytest для функций исправления обезьян: https://docs.pytest.org/en/latest/monkeypatch.html#simple-example-monkeypatching-functions