如何将参数传递给类中的装饰器

亚历克斯

我有一个单元测试,可以在数据库中加载一些数据进行测试。我为此创建了一个装饰器函数,用于测试用例

class TestCompany(unittest.TestCase):
    def setUp(self):
        ...
        self.engine = create_engine(db_url)
        Session = sessionmaker(bind=self.engine)
        self.session = Session() 


    @loadfixtures(['employee.json'])
    def test_checkdb_employee(self):
        c = self.session.query(Employee).count()
        self.assertEqual(c , 20)
    

但是,我需要以某种方式传递self.engine给装饰器。

@loadfixtures(self.engine, ['employee.json'])不起作用,因为self那里没有。

我为此创建了此解决方案,但是有没有更简单(更易读)的解决方案?

    def test_checkdb_employee(self):
        @loadfixtures(['employee.json'])
        def run(engine):
            c = self.session.query(Employee).count()
            self.assertEqual(c , 20)
        return run(self.engine)

     
#decorator
import pandas as pd
 
def loadfixtures( files):
    def decorator(func):
        def wrapped_func(*args, **kwargs):
            for file in files: 
                df = pd.read_json(Path(datafolder).joinpath(file))
                df.to_sql(file.split(".")[0], con=args[0],index=False, if_exists='append')
            return func(*args, **kwargs)
        return wrapped_func
    return decorator

engine用于中con=args[0]

格伦DJ

self实际上是作为的第一个参数传递的test_checkdb_employee因此,要访问您engine的装饰,以用作论据的con,你可以只是做参数args[0].engineargs[0]self(在TestCompany实例)。

def loadfixtures(files):
    def decorator(func):
        def wrapped_func(*args, **kwargs):
            for file in files: 
                df = pd.read_json(Path(datafolder).joinpath(file))
                df.to_sql(file.split(".")[0], con=args[0].engine, index=False, if_exists='append')
            return func(*args, **kwargs)
        return wrapped_func
    return decorator

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章