Pytest使用fixture做monkeypatch触发直接调用错误如何解决
报错根因
pytest 规定 fixture 只能通过测试函数、其他 fixture 的参数自动注入获取,不能像普通函数一样手动调用。你在 load_spacy_model fixture 内部的 _load_spacy_model 函数里直接执行了 get_staticdata_path(),属于直接调用 fixture,触发了规则校验报错。
修复方案
只需要修改 conftest.py 中的 load_spacy_model fixture,将 get_staticdata_path 作为参数注入即可,其余代码不需要调整:
import pytest from pathlib import Path import spacy @pytest.fixture def get_staticdata_path(): static_data_path = ( Path( __file__, ) .resolve() .parent / ".." / ".." / "staticdata" ) return static_data_path @pytest.fixture # 此处注入get_staticdata_path fixture,pytest会自动执行它并把返回值传入 def load_spacy_model(get_staticdata_path): def _load_spacy_model(): # 直接用注入的路径值,不需要再调用get_staticdata_path() model_path = get_staticdata_path / "en_core_web_sm" nlp = spacy.load(model_path) return nlp yield _load_spacy_model
修改完成后重新运行测试,monkeypatch 就会按照预期把 TextUtils 的 _load_spacy_model 方法替换为从本地 staticdata 目录加载模型的自定义函数,不会再触发报错。
内容的提问来源于stack exchange,提问作者yudhiesh
相关产品推荐
相关产品推荐

