在 Pytest 夹具中修补导入的函数
Patching imported functions in a Pytest fixture
我在正确修补 pytest 中的导入函数时遇到问题。我要修补的函数是一个旨在执行大型 SQL 提取的函数,因此为了提高速度,我想将其替换为读取 CSV 文件。这是我目前拥有的代码:
from data import postgres_fetch
import pytest
@pytest.fixture
def data_patch_market(monkeypatch):
test_data_path = os.path.join(os.path.dirname(__file__), 'test_data')
if os.path.exists(test_data_path):
mock_data_path = os.path.join(test_data_path, 'test_data_market.csv')
mock_data = pd.read_csv(mock_data_path)
monkeypatch.setattr(postgres_fetch, 'get_data_for_market', mock_data)
def test_mase(data_patch_market):
data = postgres_fetch.get_data_for_market(market_name=market,
market_level=market_level,
backtest_log_ids=log_ids,
connection=conn)
test_result= build_features.MASE(data)
然而,当我 运行 这个测试时,我收到有关调用 DataFrame 的类型错误:
TypeError: 'DataFrame' object is not callable
我知道 csv 可以正确读取,因为我已经单独测试过,所以我假设我实现补丁夹具的方式有问题,但我似乎无法解决
在这里,您对 monkeypatch.setattr
的调用 将对 postgres_fetch.get_data_for_market
的任何调用替换为对 的调用 =13=].
这个不能工作,因为mock_data
不是一个函数——它是一个DataFrame
对象。
相反,在调用 monkeypatch.setattr
时,您需要传入一个 函数,returns 模拟数据(即 DataFrame
对象)。
因此,像这样的东西应该可以工作:
@pytest.fixture
def data_patch_market(monkeypatch):
test_data_path = os.path.join(os.path.dirname(__file__), 'test_data')
if os.path.exists(test_data_path):
mock_data_path = os.path.join(test_data_path, 'test_data_market.csv')
mock_data = pd.read_csv(mock_data_path)
# The lines below are new - here, we define a function that will return the data we have mocked
def return_mocked(*args, **kwargs):
return mock_data
monkeypatch.setattr(postgres_fetch, 'get_data_for_market', return_mocked)
我在正确修补 pytest 中的导入函数时遇到问题。我要修补的函数是一个旨在执行大型 SQL 提取的函数,因此为了提高速度,我想将其替换为读取 CSV 文件。这是我目前拥有的代码:
from data import postgres_fetch
import pytest
@pytest.fixture
def data_patch_market(monkeypatch):
test_data_path = os.path.join(os.path.dirname(__file__), 'test_data')
if os.path.exists(test_data_path):
mock_data_path = os.path.join(test_data_path, 'test_data_market.csv')
mock_data = pd.read_csv(mock_data_path)
monkeypatch.setattr(postgres_fetch, 'get_data_for_market', mock_data)
def test_mase(data_patch_market):
data = postgres_fetch.get_data_for_market(market_name=market,
market_level=market_level,
backtest_log_ids=log_ids,
connection=conn)
test_result= build_features.MASE(data)
然而,当我 运行 这个测试时,我收到有关调用 DataFrame 的类型错误:
TypeError: 'DataFrame' object is not callable
我知道 csv 可以正确读取,因为我已经单独测试过,所以我假设我实现补丁夹具的方式有问题,但我似乎无法解决
在这里,您对 monkeypatch.setattr
的调用 将对 postgres_fetch.get_data_for_market
的任何调用替换为对 的调用 =13=].
这个不能工作,因为mock_data
不是一个函数——它是一个DataFrame
对象。
相反,在调用 monkeypatch.setattr
时,您需要传入一个 函数,returns 模拟数据(即 DataFrame
对象)。
因此,像这样的东西应该可以工作:
@pytest.fixture
def data_patch_market(monkeypatch):
test_data_path = os.path.join(os.path.dirname(__file__), 'test_data')
if os.path.exists(test_data_path):
mock_data_path = os.path.join(test_data_path, 'test_data_market.csv')
mock_data = pd.read_csv(mock_data_path)
# The lines below are new - here, we define a function that will return the data we have mocked
def return_mocked(*args, **kwargs):
return mock_data
monkeypatch.setattr(postgres_fetch, 'get_data_for_market', return_mocked)