我需要在要为其编写测试的项目上进行一些修补,但是在此之前,我创建了一个简单的项目进行尝试(它基本上使用request.get调用ipify API来获取我的公共IP,我试图猴子修补request.get函数或我自己的调用request.get的代码上的函数,以便返回固定值-在这种情况下为“ 0.0.0.0”。
项目结构如下:
项目代码如下:
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