context 我是自己实现的逻辑,模仿 Java 的 spring

需要注释一段源码 _pytest.python.Class 中 collect 方法关于 init 方法的判断,无其他修改

pytest_make_collect_report 放到 conftest 或者自己注册插件都可

@pytest.hookimpl(hookwrapper=True, trylast=True)
def pytest_make_collect_report(self, collector):
    result = yield
    result_case = result._result.result
    for i in result_case:
        if isinstance(i, Class):
            newinstance = lambda s: my_newinstance(s, self.context)
              # 修改这个方法的实现,让他调用自己写的实例化方法,实现依赖注入
            setattr(i, "newinstance", types.MethodType(newinstance, i))
def my_newinstance(self, context):
    # 从容器中获取关于依赖注入的方法
    injection: AutoInjectBeanPostProcessor = context.get_bean("autoinject_bean_post_processor")
    # 解析init参数
    args = context.bean_factory.get_init_args(self.obj.__name__, self.obj)
    # 初始化
    obj = self.obj(**args)
    # 依赖注入
    injection.inject(obj.__class__.__name__, obj, context.bean_factory)
    # 返回对象
    return obj

Brand 类是由容器创建,在创建 test 类时会根据名字或者类型进行注入

在类中写_inject 也可以实现相同效果


↙↙↙阅读原文可查看相关链接,并与作者交流