函数内部模拟函数

Mock function inside function

我正在尝试模拟一个使用 mocker 补丁进行 API 调用的函数。但是,它不起作用,即使在这个简单的示例中也是如此。 class_abcd.process_weather() 使用实际的 get_weather() 而不是模拟的

目录结构如下:

-source
  -sub
    -using_output.py
  -weather_api.py

using_output.py

from source.weather_api import get_weather

class abcd():
    def process_weather(self):
        weather = get_weather()
        return "processed " + weather 

weather_api.py

def get_weather():
    return "weather"

我正在尝试测试 process_weather 并根据天气 api 伪造 get_weather。

from pytest_mock import mocker
def test_weather_in_batch(mocker):
    # Setup
    fake_weather = "fake_weather"
    # Actual
    class_abcd = abcd()
    mocker.patch('weather_api.get_weather', return_value=fake_weather)
    actual = class_abcd.process_weather()

    # Expected
    expected = "processed " + "fake_weather"
    # Asset
    assert expected == actual

使用 mock 时,您需要指定要修补的导入,而不是底层 module/function。

from pytest_mock import mocker
def test_weather_in_batch(mocker):
    # Setup
    fake_weather = "fake_weather"
    # Actual
    class_abcd = abcd()
    mocker.patch('source.sub.using_output.get_weather', return_value=fake_weather)
    actual = class_abcd.process_weather()

    # Expected
    expected = "processed " + "fake_weather"
    # Asset
    assert expected == actual

在您的情况下,您正在将 get_weather 导入 using_output.py

因为你想在 using_output.py 中使用 get_weather 的模拟版本,这就是你需要修补的地方。