无法在python + pytest上使用Monkeypatch函数

时间:2019-09-22 13:16:55

标签: python testing mocking pytest monkeypatching

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

项目结构如下:

  • 根目录
    • ipify_api(我的软件包)
      • methods.py(这里有返回API返回的公共IP的函数)
      • helpers.py(这里有调用API并返回响应的函数)
    • 测试
      • test_ipify.py

项目代码如下:

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

0 个答案:

没有答案