如何在测试场景下修改Luigi类的依赖输入路径,获取指定测试文件路径
问题原因
你每次调用class_instance.requires()都会重新执行方法逻辑,返回一个全新的LocalTarget("test_file.txt")实例,所以你修改前一次调用返回实例的path属性,下一次调用拿到的还是原路径的新实例,自然不会生效。
解决方案
方案1:给Luigi任务新增参数(推荐,符合Luigi原生设计)
如果除了测试外,日常也有动态修改输入路径的需求,直接给任务新增可配置的路径参数即可,无需打补丁,代码可维护性更高:
import pytest import luigi class LuigiToBeTested(luigi.ExternalTask): # 新增路径参数,默认值保留原始的test_file.txt input_path = luigi.Parameter(default="test_file.txt") def requires(self): return luigi.LocalTarget(self.input_path) def test_Luigi(): # 测试场景下传入自定义的测试文件路径 class_instance = LuigiToBeTested(input_path="data.json") print('/////', class_instance.requires().path) # 输出data.json
方案2:用pytest monkeypatch打补丁(无需修改原有业务代码)
如果不想改动原有业务类的代码,只在测试时临时修改逻辑,可以用pytest自带的monkeypatch工具mockrequires方法的返回值:
import pytest import luigi class LuigiToBeTested(luigi.ExternalTask): def requires(self): return luigi.LocalTarget("test_file.txt") def test_Luigi(monkeypatch): class_instance = LuigiToBeTested() # 直接mock整个requires方法的返回值 monkeypatch.setattr(class_instance, "requires", lambda: luigi.LocalTarget("data.json")) print('/////', class_instance.requires().path) # 输出data.json
内容的提问来源于stack exchange,提问作者viktor_dmitry
相关产品推荐
相关产品推荐

